點擊python編程從入門到實踐,置頂 公衆號重磅 python入門資料,第一時間送達html
haishiniupython
讀完須要面試
9數據庫
分鐘速讀僅需 3 分鐘編程
/ python 編程 30 秒高級私人定製 Response 對象,十倍擴展效率 /json
注:這篇文章很長,但我保證你看完後能進行高度自定義 Response 提神開發效率。api
在 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"}
3
總結
1.介紹了 fastapi 中 Response 模型
2.講解了如何去自定義 Response,讀者可根據本身的業務場景進行實踐
3.簡單介紹了 status_code ,下節在分享 fastapi 異常處理的時候還會再講解
最近有小夥伴後臺留言問有沒有面試相關的資料,週末整理了一份面試須要注意的點已作成思惟導圖,須要的同窗請在後臺回覆「面試」就能夠 get 此項技能
往期推薦
大型fastapi項目實戰 靠 python 中間件解決方案漲薪了
大型fastapi項目實戰 高併發請求神器之aiohttp(下)
大型fastapi項目實戰 高併發請求神器之aiohttp(上) [建議收藏]
本文分享自微信公衆號 - python編程軍火庫(PythonCoder1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。