1+1=10

扬长避短 vs 取长补短

Python FastAPI入门笔记(四)

前面接触到了用于注解的 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/

Python web

Comments