FastAPI入门:Cookie参数、Header参数、Cookie参数模型、Header参数模型
Cookie参数
定义 Cookie 参数与定义 Query 和 Path 参数一样。
第一个值是默认值,还可以传递所有验证参数或注释参数
from typing import Annotatedfrom fastapi import Cookie, FastAPIapp = FastAPI()@app.get("/items/")
async def read_items(ads_id: Annotated[str | None, Cookie()] = None):return {"ads_id": ads_id}
Header参数
定义 Header 参数的方式与定义 Query、Path、Cookie 参数相同。
from fastapi import FastAPI, Header
from typing import Annotated, List
from pydantic import BaseModel, Fieldapp = FastAPI()@app.put("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):return {"user-agent": user_agent}
自动转换
大部分标准请求头用连字符分隔,即减号(-)。但是 user-agent 这样的变量在 Python 中是无效的。
因此,默认情况下,Header 把参数名中的字符由下划线(_)改为连字符(-)来提取并存档请求头 。
同时,HTTP 的请求头不区分大小写,可以使用 Python 标准样式(即 snake_case)进行声明。因此,可以像在 Python 代码中一样使用 user_agent ,无需把首字母大写为 User_Agent 等形式。
如需禁用下划线自动转换为连字符,可以把 Header 的 convert_underscores 参数设置为 False
重复请求头
类型声明中可以使用 list 定义多个请求头。使用 Python list 可以接收重复请求头所有的值
例如,声明 X-Token 多次出现的请求头:
from typing import Annotatedfrom fastapi import FastAPI, Headerapp = FastAPI()@app.get("/items/")
async def read_items(x_token: Annotated[list[str] | None, Header()] = None):return {"X-Token values": x_token}
Cookie参数模型
如果有一组相关的 cookie,可以创建一个 Pydantic 模型来声明它们
from typing import Annotatedfrom fastapi import Cookie, FastAPI
from pydantic import BaseModelapp = FastAPI()class Cookies(BaseModel):session_id: strfatebook_tracker: str | None = Nonegoogall_tracker: str | None = None@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):return cookies
禁止额外cookie
可以使用 Pydantic 的模型配置来禁止( forbid )任何额外( extra )字段
class Cookies(BaseModel):model_config = {"extra": "forbid", # 禁止额外字段}session_id: str | None = Nonefatebook_tracker: str | None = Nonegoogall_tracker: str | None = None
Header参数模型
如果有一组相关的 Header,可以创建一个 Pydantic 模型来声明它们
from fastapi import FastAPI, Header, Cookie
from typing import Annotated, List
from pydantic import BaseModel, Fieldapp = FastAPI()class CommonHeaders(BaseModel):host: str | None = Nonesave_data: boolif_modified_since: str | None = Nonetraceparent: str | None = Nonex_tag: list[str] = []@app.put("/items/")
async def read_items(headers: Annotated[CommonHeaders, Header()]):return headers
禁止额外Header
可以使用 Pydantic 的模型配置来禁止( forbid )任何额外( extra )字段
class CommonHeaders(BaseModel):model_config = {"extra": "forbid"}host: strsave_data: boolif_modified_since: str | None = Nonetraceparent: str | None = Nonex_tag: list[str] = []