fastapi之请求头和Cookie

606 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

Header获取请求头参数

fastapi提供了非常方便的方式获取请求头参数,这个方式就是Header,它和 Query, PathCookie 参数的使用方式几乎一样。

  • 比如从请求头中获取参数User-Agent,fastapi会自动从请求头中把这个参数提取出来。
 from typing import Union
 ​
 from fastapi import FastAPI, Header
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/")
 async def read_items(user_agent: Union[str, None] = Header(default=None)):
     return {"User-Agent": user_agent}

自动转换

  • 大多数标准的请求头参数会使用-当连接符,比如:`User-Agent
  • 但是你看上例中,user_agent是python的中一种命名风格,因此默认情况下, Header 将把参数名称的字符从下划线 (_) 转换为连字符 (-) 来提取并记录 headers
  • 同时,HTTP headers是大小写不敏感的,因此,因此可以使用标准Python样式(也称为 "snake_case")声明它们。
  • 如果你希望fastapi不要帮忙做这些转换,那刻意把设置:convert_underscores=False,默认是True
  • 如果设置convert_underscores=True,那么需要保证客户端传过来该参数是:user_agent,否则该参数为None
 from typing import Union
 ​
 from fastapi import FastAPI, Header
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/")
 async def read_items(
     user_agent: Union[str, None] = Header(default=None, convert_underscores=False)
 ):
     return {"strange_header": strange_header}

请求头参数多个值

  • 一个请求头参数可以有多个值,此时定义定义请求头参数的类型为列表即可
 from typing import List, Union
 ​
 from fastapi import FastAPI, Header
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/")
 async def read_items(x_token: Union[List[str], None] = Header(default=None)):
     return {"X-Token values": x_token}
  • 此时如果请求为
 curl --location --request GET 'http://127.0.0.1:8000/items/' \
 --header 'x-token: 123' \
 --header 'x-token: 456'
  • 此时响应为:
 {
     "X-Token values": [
         "123",
         "456"
     ]
 }

Cookie

  • fastapi提供了Cookie参数,和Header\Body\Path\Query等参数类似,用来获取请求头中的Cookie参数。
  • Cookie第一个值是参数的默认值,同时也可以传递所有验证参数或注释参数,来校验参数:
 from typing import Union
 ​
 from fastapi import Cookie, FastAPI
 ​
 app = FastAPI()
 ​
 ​
 @app.get("/items/")
 async def read_items(ads_id: Union[str, None] = Cookie(default=None)):
     return {"ads_id": ads_id}