Erlo

python编程 30秒高级私人定制 Response对象

2021-03-15 18:00:18 发布   629 浏览  
页面报错/反馈
收藏 点赞

点击python编程从入门到实践置顶 公众号重磅 python入门资料,第一时间送达

 

 

haishiniu

 

读完需要

9

分钟

速读仅需 3 分钟

/ python 编程 30 秒高级私人定制 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 Optional
from fastapi import FastAPIfrom fastapi.encoders import jsonable_encoderfrom fastapi.responses import JSONResponsefrom pydantic import BaseModel

class Item(BaseModel):    title: str    name: str    description: Optional[str] = None

app = 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, Response
app = 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 BaseModel

class Item(BaseModel):    id: str    value: str

class Message(BaseModel):    message: str

app = 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 BaseModel

class Item(BaseModel):    id: str    value: str

app = 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 BaseModel

class Item(BaseModel):    id: str    value: str

responses = {    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源创计划”,欢迎正在阅读的你也加入,一起分享。

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认