python編程 30秒高級私人定製 Response對象

點擊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 此項技能

往期推薦

python生產實戰 python 閉包之庖丁解牛篇

大型fastapi項目實戰 靠 python 中間件解決方案漲薪了

大型fastapi項目實戰 高併發請求神器之aiohttp(下)

大型fastapi項目實戰 高併發請求神器之aiohttp(上) [建議收藏]

 

 

本文分享自微信公衆號 - python編程軍火庫(PythonCoder1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索