作者:麥克煎蛋 出處: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)