- ASGI入门笔记:ASGI入门
- FastAPI入门一:FastAPI路径操作函数与响应
- FastAPI入门二:FastAPI路径参数与查询参数
- FastAPI入门三:FastAPI请求体(Request Body)
- FastAPI入门四:FastAPI中Cookie参数与Header参数
前面接触到了用于注解的 Path、Query、Body、Field、Form、File、UploadFile等,接下来看看Cookie和Header。
内容小记:
- Cookie 的设置与读取,Response参数使用与Response直接使用
- Header的读取,Request参数使用
注:本文代码在python3.11下验证
Cookie
先看看Cookie读取与设置。
- Cookie读取和其他变量一样,使用Cookie对变量进行注解即可。
- Cookie的写入,需要对response进行操作,调用其
set_cookie()
函数
一个完整的例子如下:
from fastapi import FastAPI, Cookie
from fastapi.responses import Response
from typing import Annotated
app = FastAPI()
@app.get('/')
async def index(response: Response, user: Annotated[str | None, Cookie()] = None):
if user is None:
response.set_cookie('user', '1')
return {'message': 'Hello World'}
response.set_cookie('user', str(int(user) + 1))
return {'message': f'Hello {user}'}
从例子中看到,获取cookie信息很简单。
使用Response参数 设置Cookie
上面的例子中,我们在路径函数中定义一个类型为 Response
的参数,并在这个临时响应对象中设置了cookie。
FastAPI会使用这个临时响应对象去装在这些cookies信息(同样还可以装在headers和状态码信息),最终将这些信息和通过response_model
转化过的数据合并到最终的响应里面。
@app.get('/')
async def index(response: Response):
response.set_cookie('user', '1')
return {'message': 'Hello World'}
直接使用Response 设置Cookie
除了上面方法,还可以直接创建要返回的response对象,并对接进行设置:
@app.get('/')
async def index():
response = JSONResponse(content={'message': 'Hello World'})
response.set_cookie('user', '1')
return response
Header
看看如何读取Header信息
使用Header注解
和Cookie获取操作基本一样,只不过使用Header进行注解。
from fastapi import FastAPI, Header
from typing import Annotated
app = FastAPI()
@app.get('/')
async def index(user_agent: Annotated[str | None, Header()] = None):
return {'User-Agent': user_agent}
注意,我们使用的是 user_agent
,而不是将首字母大写为 User_Agent
或类似的东西。
这是因为:
-
大多数标准的headers用 "连字符 (
-
)" 分隔。但是像user-agent
这样的变量在Python中是无效的。 -
默认情况下,
Header
将把参数名称的字符从下划线 (_
) 转换为连字符 (-
) 来提取并记录 headers. -
HTTP headers 是大小写不敏感的,因此可以使用标准Python样式("snake_case")声明它们。
使用Request参数
from fastapi import FastAPI, Header, Request
from typing import Annotated
app = FastAPI()
@app.get('/')
async def index(request: Request):
return {'User-Agent': request.headers.get('user-agent')}
注:
- 与本例子类似,cookies 也可以通过Request参数进行获取。
参考
- https://fastapi.tiangolo.com
- https://docs.pydantic.dev/latest/
- https://fastapi.tiangolo.com/tutorial/cookie-params/
- https://fastapi.tiangolo.com/advanced/response-cookies/