本篇文章给大家分享的是有关怎么使用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。