python:Fastapi - Cookie 和 Header

640 阅读3分钟
  • 简单唠叨下

前面唠了一些关于请求体的一些事情,这次主要唠下cookieheader的东西,cookieheaderPathQuery一样都是继承公共的Param类,传参的一些参数都差不多是一样的。

区别的就是PathQuery是在postman中的Param中放入参数进行请求,而cookieheader则是在postman中的Headers中放入参数进行请求



  • Cookie参数

导入 Cookie

声明 Cookie 参数的结构与声明 Query 参数和 Path 参数时相同。

第一个值是参数的默认值,同时也可以传递所有验证参数或注释参数,来校验参数:

from typing import Optional
from fastapi import Cookie, FastAPI

app = FastAPI()


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

Cookie(...)的默认值设置的是必填参数,如果请求时不填写则抛出异常
Cookie(None)的默认值设置的是None,请求时则不填写,不会抛出,请求结果返回是null

启动服务:

PS E:\git_code\python-code\fastapiProject> uvicorn cookie_main:app --reload

请求接口:

GET http://127.0.0.1:8000/items

请求参数:

KEYVALUE
Cookieads_id=hello

请求结果:

{
    "ads_id": "hello"
}


  • Header参数

首先导入 Header

然后使用和PathQueryCookie 一样的结构定义 Header 参数

第一个值是默认值,你可以传递所有的额外验证或注释参数:

from typing import Optional
from fastapi import FastAPI, Header

app = FastAPI()


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

Header(...)的默认值设置的是必填参数,如果请求时不填写则抛出异常。但是如果你在工具(例如:postman浏览器)中请求接口,工具会默认给你提供一个user_agent,所以自然就看不到报错了。

HeaderPathQueryCookie 提供的功能之上有一点额外的功能:

1、user-agent 这样的变量在Python中是无效的,默认情况下, Header 将把参数名称的字符从下划线 _ 转换为连字符 - 来提取并记录 headers.
2、HTTP headers中对大小写不敏感,只要传的跟HTTP头信息规定的字段一样,会自动转换。

启动服务:

PS E:\git_code\python-code\fastapiProject> uvicorn header_main:app --reload

请求接口:

GET http://127.0.0.1:8000/items

请求参数:

KEYVALUE
user-agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36

请求结果:

{
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}

但是有些时候出于某些原因,需要禁用下划线到连字符的自动转换,设置Header的参数 convert_underscoresFalse即可:

from typing import Optional
from fastapi import FastAPI, Header

app = FastAPI()


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

启动服务:

PS E:\git_code\python-code\fastapiProject> uvicorn header_main:app --reload

请求接口:

GET http://127.0.0.1:8000/items

请求参数:

KEYVALUE
user-agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36

请求结果:

{
    "detail": [
        {
            "loc": [
                "header",
                "user_agent"
            ],
            "msg": "field required",
            "type": "value_error.missing"
        }
    ]
}

从请求结果可以清晰看到,类型错误,导致这个抛出错误原因就是在headers中设置了convert_underscores=False

**注意点: **因为有些代理服务器不支持使用带有下划线的headers,所以就会出现矛盾体,就是我既想禁用,又想正常访问的问题。对于这个问题,大家探讨吧…

因为与路径通信时会发送多个HTTP headers,对于重复的headers 则需要使用一个list来获得重复header的所有值:

from typing import Optional
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
def read_items(x_token: Optional[list[str]] = Header(...)):
    return {"x-token values": x_token}

启动服务:

PS E:\git_code\python-code\fastapiProject> uvicorn header_main:app --reload

请求接口:

GET http://127.0.0.1:8000/items

请求参数:

KEYVALUE
x-token1234567
x-token123456789
x-token12345678910

请求结果:

{
    "x-token values": [
        "1234567",
        "123456789",
        "12345678910"
    ]
}

今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】哟,谢谢!

未完成,待续……

一直在努力,希望你也是!

微信搜索公众号:就用python