FastAPI Response(二) 直接返回Response对象
作者:麦克煎蛋 出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!
在FastAPI路径操作中,我们通常直接返回以下数据类型:dict,list,Pydantic模型,数据库模型以及其他数据类型。
FastAPI通过jsonable_encoder
函数自动
把返回数据转换为JSON格式,然后把JSON兼容的数据内容传送给JSONResponse
对象并返回给终端用户。
在有些情况下,我们需要在路径操作中直接返回Response对象,这样我们能有更多的操作灵活性,比如自定义头信息、自定义Cookie信息等。
返回Response
我们可以直接返回Response
或者它的任何子类。 JSONResponse实际上也是Response的子类。
这个时候FastAPI不会做任何数据转换和数据校验,而是直接返回数据。
我们具有很大的灵活性,可以返回任何数据类型,重写数据声明或者数据校验。
我们可以利用jsonable_encoder把数据转换成JSON兼容格式。
from datetime import datetime
from typing import Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel
class Item(BaseModel):
title: str
timestamp: datetime
description: Optional[str] = None
app = FastAPI()
@app.put("/items/{id}")
def update_item(id: str, item: Item):
json_compatible_item_data = jsonable_encoder(item)
return JSONResponse(content=json_compatible_item_data)
返回自定义Response
我们来看一下如何返回一个自定义的Response,比如返回XML格式的数据。
from fastapi import FastAPI, Response app = FastAPI() @app.get("/legacy/") def get_legacy_data(): data = """<?xml version="1.0"?> <shampoo> <Header> Apply shampoo here. </Header> <Body> You'll have to use soap here. </Body> </shampoo> """ return Response(content=data, media_type="application/xml")