FastAPI 基础学习(十三) Header操作
作者:麦克煎蛋 出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!
读取Header信息
基于Query、Path、Cookie等模块同样的模式,我们可以利用Header模块来声明headers。
我们可以用定义其他模块参数同样的方式,便捷的定义Header模块的参数信息。
Header是Query、Path、Cookie的姐妹类,它们都继承自Param类。
1、导入模块
from fastapi import Header
2、添加参数信息
参数信息的结构与Query、Path、Cookie等模块完全相同。
user_agent: str = Header(None)
完整示例:
from fastapi import FastAPI, Header app = FastAPI() @app.get("/items/") async def read_items(*, user_agent: str = Header(None)): return {"User-Agent": user_agent}
3、自动转换
大多数headers中都带有"-"字符,如"User-Agent
",但在Python中,User-Agent
并不是一个合法的变量名称。
因此为了能正确提取headers中的信息,Header模块会把参数名称中的"_"转换成"-"。
Http Headers同时也是大小写不敏感的,因此我们可以在Python代码中使用user_agent来表示User-Agent
。
from fastapi import FastAPI, Header app = FastAPI() @app.get("/items/") async def read_items(*, user_agent: str = Header(None)): return {"user_agent": user_agent}
如果我们添加User-Agent参数并访问:
http://127.0.0.1:8000/items/
输出结果为:
{ "user_agent": "Mozilla" }
我们可以通过设置Header中的convert_underscores参数为Flase,来禁止这种从"_"到"-"的字符转换(大多数情况下并并不需要)。
from fastapi import FastAPI, Header app = FastAPI() @app.get("/items/") async def read_items(*, user_agent: str = Header(None, convert_underscores=False)): return {"user_agent": user_agent}
4、重复headers处理
有些情况下,同样的header会带有多个值。
X-Token: foo
X-Token: bar
这时候,我们可以用一个list来接收重复的header数据。
from typing import List from fastapi import FastAPI, Header app = FastAPI() @app.get("/items/") async def read_items(x_token: List[str] = Header(None)): return {"X-Token values": x_token}
响应结果为:
{ "X-Token values": [ "bar", "foo" ] }
返回Header信息
我们可以在Response中返回Header信息给终端。
1、使用Response参数
我们可以在路径操作函数中声明Response
参数,然后给这个临时的Response
对象设置header信息。
FastAPI通过这个临时的Response
对象解析出header信息(以及cookie信息和状态码等),然后放入到最终返回的Response
对象中。
我们也可以在依赖项中使用Response参数,然后设置header信息(以及cookie信息等)。
from fastapi import FastAPI, Response app = FastAPI() @app.get("/headers-and-object/") def get_headers(response: Response): response.headers["X-Cat-Dog"] = "alone in the world" return {"message": "Hello World"}
2、直接返回Response
我们也可以在直接返回的Response对象中设置header信息。
from fastapi import FastAPI from fastapi.responses import JSONResponse app = FastAPI() @app.get("/headers/") def get_headers(): content = {"message": "Hello World"} headers = {"X-Cat-Dog": "alone in the world", "Content-Language": "en-US"} return JSONResponse(content=content, headers=headers)