FastAPI Web框架 [1.6]

Posted Ch4536251

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastAPI Web框架 [1.6]相关的知识,希望对你有一定的参考价值。

模式的额外信息 - 例子

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()

#   您可以在JSON模式中定义额外的信息。
#
# 一个常见的用例是添加一个将在文档中显示的example。
#
# 有几种方法可以声明额外的 JSON 模式信息。

#   使用 Config 和 schema_extra 为Pydantic模型声明一个示例
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

    class Config:
        schema_extra = 
            "example": 
                "name": "Foo",
                "description": "A very nice Item",
                "price": 35.4,
                "tax": 3.2,
            
        

@app.put("/items/item_id")
async def update_item(item_id: int, item: Item):
    results = "item_id": item_id, "item": item
    return results
#   这些额外的信息将按原样添加到输出的JSON模式中。


#   Field 的附加参数
#   在 Field, Path, Query, Body 和其他你之后将会看到的工厂函数,你可以为JSON 模式声明额外信息,你也可以通过给工厂函数传递其他的任意参数来给JSON 模式声明额外信息,比如增加 example:
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str = Field(..., example="Foo")
    description: Optional[str] = Field(None, example="A very nice Item")
    price: float = Field(..., example=35.4)
    tax: Optional[float] = Field(None, example=3.2)


@app.put("/items/item_id")
async def update_item(item_id: int, item: Item):
    results = "item_id": item_id, "item": item
    return results
#   请记住,传递的那些额外参数不会添加任何验证,只会添加注释,用于文档的目的。


#   Body 额外参数
#   你可以通过传递额外信息给 Field 同样的方式操作Path, Query, Body等。
#
# 比如,你可以将请求体的一个 example 传递给 Body:
from typing import Optional

from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

@app.put("/items/item_id")
async def update_item(
    item_id: int,
    item: Item = Body(
        ...,
        example=
            "name": "Foo",
            "description": "A very nice Item",
            "price": 35.4,
            "tax": 3.2,
        ,
    ),
):
    results = "item_id": item_id, "item": item
    return results

技术细节

关于 example 和 examples…
JSON Schema在最新的一个版本中定义了一个字段 examples ,但是OpenAPI 基于之前的一个旧版JSON Schema,并没有 examples.
所以 OpenAPI为了相似的目的定义了自己的example (使用 example, 而不是 examples), 这也是文档 UI 所使用的 (使用 Swagger UI).
所以,虽然 example 不是JSON Schema的一部分,但它是OpenAPI的一部分,这将被文档UI使用。

额外数据类型

到目前为止,一直在使用常见的数据类型,如:

int
float
str
bool

下面是一些你可以使用的其他数据类型:

UUID:
一种标准的 “通用唯一标识符” ,在许多数据库和系统中用作ID。
在请求和响应中将以 str 表示。

datetime.datetime:
一个 Python datetime.datetime.
在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 2008-09-15T15:53:00+05:00.

datetime.date:
Python datetime.date.
在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 2008-09-15.

datetime.time:
一个 Python datetime.time.
在请求和响应中将表示为 ISO 8601 格式的 str ,比如: 14:23:55.003.

datetime.timedelta:
一个 Python datetime.timedelta.
在请求和响应中将表示为 float 代表总秒数。
Pydantic 也允许将其表示为 “ISO 8601 时间差异编码”, 查看文档了解更多信息。

frozenset:
在请求和响应中,作为 set 对待:
在请求中,列表将被读取,消除重复,并将其转换为一个 set。
在响应中 set 将被转换为 list 。
产生的模式将指定那些 set 的值是唯一的 (使用 JSON 模式的 uniqueItems)。

bytes:
标准的 Python bytes。
在请求和相应中被当作 str 处理。
生成的模式将指定这个 str 是 binary “格式”。

Decimal:
标准的 Python Decimal。
在请求和相应中被当做 float 一样处理。

from fastapi import FastAPI,Body
from datetime import datetime,timedelta,time
from typing import Optional
from uuid import UUID
app = FastAPI()

@app.put("/items/item_id")
async def read_items(
        item_id:UUID,
        start_datetime: Optional[datetime] = Body(None),
        end_datetime: Optional[datetime] = Body(None),
        repeat_at: Optional[time] = Body(None),
        process_after: Optional[timedelta] = Body(None)
):
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    return 
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "repeat_at": repeat_at,
        "process_after": process_after,
        "start_process": start_process,
        "duration": duration,
    
#   注意,函数内的参数有原生的数据类型,你可以,例如,执行正常的日期操作

Cookie参数

#   可以像定义 Query 参数和 Path 参数一样来定义 Cookie 参数。
from fastapi import FastAPI,Cookie      #导入 Cookie
from typing import Optional
app = FastAPI()

@app.get("/items/")
async def read_items(ads_id:Optional[str] = Cookie(None)):          #   声明 Cookie 参数
    return "ads_id":ads_id
#   声明 Cookie 参数的结构与声明 Query 参数和 Path 参数时相同。
#   第一个值是参数的默认值,同时也可以传递所有验证参数或注释参数,来校验参数。

#   Cookie 、Path 、Query是兄弟类,它们都继承自公共的 Param 类.
#   但请记住,当你从 fastapi 导入的 Query、Path、Cookie 或其他参数声明函数,这些实际上是返回特殊类的函数。

#   需要使用 Cookie 来声明 cookie 参数,否则参数将会被解释为查询参数。

Header参数

#   使用定义 Query, Path 和 Cookie 参数一样的方法定义 Header 参数。
from typing import Optional
from fastapi import FastAPI,Header  #   导入 Header
app = FastAPI()

@app.get("/items/")
async def read_items(user_agent:Optional[str] = Header(None)):          #声明 Header 参数,使用和Path, Query and Cookie 一样的结构定义 header 参数,
    #   第一个值是默认值,你可以传递所有的额外验证或注释参数
    return 
        "User-Agent":user_agent
    
#   Header 是 Path, Query 和 Cookie 的兄弟类型。它也继承自通用的 Param 类.
# 但是请记得,当你从fastapi导入 Query, Path, Header, 或其他时,实际上导入的是返回特定类型的函数。
#   为了声明headers, 你需要使用Header, 因为否则参数将被解释为查询参数。


#   自动转换
#   Header 在 Path, Query 和 Cookie 提供的功能之上有一点额外的功能。

# 大多数标准的headers用 "连字符" 分隔,也称为 "减号" (-)。
# 但是像 user-agent 这样的变量在Python中是无效的。
# 因此, 默认情况下, Header 将把参数名称的字符从下划线 (_) 转换为连字符 (-) 来提取并记录 headers.
# 同时,HTTP headers 是大小写不敏感的,因此,因此可以使用标准Python样式(也称为 "snake_case")声明它们。
# 因此,您可以像通常在Python代码中那样使用 user_agent ,而不需要将首字母大写为 User_Agent 或类似的东西。

# 如果出于某些原因,你需要禁用下划线到连字符的自动转换,设置Header的参数 convert_underscores 为 False:
from typing import Optional

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Optional[str] = Header(None, convert_underscores=False)
):
    return "strange_header": strange_header
#   在设置 convert_underscores 为 False 之前,请记住,一些HTTP代理和服务器不允许使用带有下划线的headers。



#   重复的 headers
#   有可能收到重复的headers。这意味着,相同的header具有多个值。
#
# 您可以在类型声明中使用一个list来定义这些情况。
#
# 你可以通过一个Python list 的形式获得重复header的所有值。
#

# 比如, 为了声明一个 X-Token header 可以出现多次,你可以这样写:
from typing import List, Optional
from fastapi import FastAPI, Header
app = FastAPI()

@app.get("/items/")
async def read_items(x_token: Optional[List[str]] = Header(None)):
    return "X-Token values": x_token
#   如果你与路径操作通信时发送两个HTTP headers,就像:
# X-Token: foo
# X-Token: bar
#   响应会是:
#   
#     "X-Token values": [
#         "bar",
#         "foo"
#     ]
# 

#   使用 Header 来声明 header , 使用和 Query, Path 与 Cookie 相同的模式。
#
# 不用担心变量中的下划线,FastAPI 会负责转换它们。

以上是关于FastAPI Web框架 [1.6]的主要内容,如果未能解决你的问题,请参考以下文章

三分钟了解 Python3 的异步 Web 框架 FastAPI

FastAPI Web框架 [1.1]

FastAPI Web框架 [1.4]

FastAPI Web框架 [依赖项]

FastAPI Web框架 [依赖项]

FastAPI Web框架 [1.10]