fastapi教程-进阶四(cookie、header parameter)

参考内容

fastapi教程-进阶(三)fastapi教程-进阶(二)中我们介绍了QueryPathBody参数,这里介绍cookieheader

Cookie

from typing import Optional

from fastapi import Cookie, FastAPI

app = FastAPI()


@app.get("/items/")
async def read_items(ads_id: Optional[str] = Cookie(None)):
    return {
    
    "ads_id": ads_id}

要获取cookie,必须需要使用Cookie来声明,否则参数将被解释为查询参数。

Header

from typing import Optional

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Optional[str] = Header(None)):
    return {
    
    "User-Agent": user_agent}

启动服务,并尝试请求http://127.0.0.1:8000/items/,会返回:

{
    
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"}

我们会发现,代码中的user_agent会自动获取请求头中的User-Agent的值,但是他们的大小写和符号并不相同,这是为什么呢?

大部分请求头中的key是用-来分割的,比如User-Agent,但是这种命名在python中是不符合规范的,因此,Header会自动将参数名称中的下划线_转换为连字符-。另外,http请求头不区分大小写,因此我们可以用符合python规范的命名方法来表示他们。

如果由于某种原因需要禁用下划线_到连字符-的自动转换,需要将Header的参数convert_underscores设置为False:

from typing import Optional

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
        user_agent: Optional[str] = Header(None, convert_underscores=False)
):
    return {
    
    "User-Agent": user_agent}

这时我们在请求http://127.0.0.1:8000/items/时,会返回:

{
    
    "User-Agent":null}

重复的请求头

如果请求头中同一个key有多个value,例如:

X-Token: foo
X-Token: bar

这时候应该如何定义呢?

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}

我们用postman模拟请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcD2UYHg-1598929224418)(evernotecid://FBE381A3-17C7-41D9-AA37-9C5F29FAB396/appyinxiangcom/20545635/ENResource/p215)]

会返回:

{
    
    
    "User-Agent": null,
    "X-Token values": [
        "foo",
        "bar"
    ]
}

总结

  1. 如果要获取cookie或header,必须要用CookieHeader来声明参数,否则fastapi会把参数当作查询参数
  2. Header会自动转换请求头中的参数,将参数名称中的下划线_转换为连字符-,因此在参数命名时我们可以遵守python规范
  3. 如果不想让Header自动转换可以给Header设置convert_underscores=False
  4. 获取重复请求头时只需要用List来声明参数类型

上述栗子均放到git上啦,地址:戳这里

猜你喜欢

转载自blog.csdn.net/weixin_40156487/article/details/108336769