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")

 

posted on 2020-07-10 15:40  麦克煎蛋  阅读(4950)  评论(0编辑  收藏  举报