您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么使用python編程私人定制Response對象,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
這篇文章很長,但我保證你看完后能進行高度自定義 Response 提神開發效率。
在 fastapi 路徑操作中,通常直接返回以下數據類型:dict,list,Pydantic 模型,數據庫模型以及其他數據類型。fastapi 通過 jsonable_encoder 函數自動把返回數據轉換為 JSON 格式,然后把 JSON 兼容的數據內容傳送給 JSONResponse 對象并返回給終端用戶。
但在某些情況下,我們需要在路徑操作中直接返回 Response 對象,這樣我們能有更多的操作靈活性,比如我們上節講的自定義 Cookie 信息,自定義頭信息。
1
Response 模型
Response 主類,所有其他的 Response 都繼承自這個類。
它接收以下參數信息:
content - str 或者 bytes
status_code - HTTP 狀態碼
headers - 字符串字典
media_type - media type. 例如"text/html"
fastapi 會自動包含 Content-Length,以及 Content-Type,charset 等頭信息。
1.1
返回 Response
我們可以直接返回 Response 或者它的任何子類。JSONResponse 實際上也是 Response 的子類。這個時候 fastapi 不會做任何數據轉換和數據校驗,而是直接返回數據。若我們想具有很大的靈活性,可以返回任何數據類型,重寫數據聲明或者數據校驗。則可以利用 jsonable_encoder 把數據轉換成 JSON 兼容格式。
# -*- encoding: utf-8 -*-from datetime import datetimefrom typing import Optionalfrom fastapi import FastAPIfrom fastapi.encoders import jsonable_encoderfrom fastapi.responses import JSONResponsefrom pydantic import BaseModelclass Item(BaseModel): title: str name: str description: Optional[str] = Noneapp = FastAPI()@app.get("/info")def get_item(item: Item): json_compatible_item_data = jsonable_encoder(item) return JSONResponse(content=json_compatible_item_data)
1.2
返回自定義 Response
我們也是可以返回自定義的 Response
# -*- encoding: utf-8 -*-from fastapi import FastAPI, Responseapp = FastAPI()@app.get("/get_json_info")def get_json_data(): data = { "name": "haishiniu", "address": "beijing" } return Response(content=data, media_type="application/json")
2
高級自定義 Response
我們也可以更靈活的定制返回結果用于滿足我們的日常開發工作。
2.1
參數 responses
我們可以傳遞給路徑操作裝飾器一個參數 responses,他接收一個字典數據,鍵值是不同的 HTTP 狀態碼,內容是不同情況下的返回內容(字典格式)。如果返回內容包含鍵值 model,那么它的作用與 response_model 相同,指向的內容是 Pydantic 模型。如下示例,當返回狀態碼是 404 的時候,對應的 Pydantic 模型是 Message :
# -*- encoding: utf-8 -*-from fastapi import FastAPIfrom fastapi.responses import JSONResponsefrom pydantic import BaseModelclass Item(BaseModel): id: str value: strclass Message(BaseModel): message: strapp = FastAPI()@app.get("/get_info/{item_id}", response_model=Item, responses={404: {"model": Message}})async def read_item(item_id: str): if item_id == "666": return {"id": "666", "value": "good job ! find haishiniu "} else: return JSONResponse(status_code=404, content={"message": "not good ! you are not find me"})
分析上面的示例,在正常情況下返回的數據模型是 Item,404 的時候返回的數據模型是 Message。
2.2
不同的 media type
參數 responses 也支持不同的 media type。
# -*- encoding: utf-8 -*-from typing import Optionalfrom fastapi import FastAPIfrom fastapi.responses import FileResponsefrom pydantic import BaseModelclass Item(BaseModel): id: str value: strapp = FastAPI()@app.get( "/get_info/{item_id}", response_model=Item, responses={ 200: { "content": {"image/png": {}}, "description": "Return the JSON item or an image.", } },)async def read_item(item_id: str, img: Optional[bool] = None): if img: return FileResponse("image.png", media_type="image/png") else: return {"id": "888", "value": "not good to find value image/png"}
如上所示,默認的 media type 是 application/json,同時還支持 image/png。
2.3
預定義 responses 與自定義 responses 并行
本小節我們是我們自定義的加強版本,可進行任意的擴展
from typing import Optionalfrom fastapi import FastAPIfrom fastapi.responses import FileResponsefrom pydantic import BaseModelclass Item(BaseModel): id: str value: strresponses = { 404: {"description": "Item not found"}, 302: {"description": "The item was moved"}, 403: {"description": "Not enough privileges"},}app = FastAPI()@app.get( "/get_info/{item_id}", response_model=Item, responses={**responses, 200: {"content": {"image/png": {}}}},)async def read_item(item_id: str, img: Optional[bool] = None): if img: return FileResponse("image.png", media_type="image/png") else: return {"id": "foo", "value": "not good to find value image/png"}
以上就是怎么使用python編程私人定制Response對象,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。