随着fastapi学习的深入,渐渐的不满足返回json这种格式,想要url重定向怎么办?想输出纯文本怎么办?想直接返回一个文件怎么办?这节来回答这些问题
直接查看fastapi.responses
的源码,我们看到以下定义好的返回类型
from starlette.responses import FileResponse # noqa
from starlette.responses import HTMLResponse # noqa
from starlette.responses import JSONResponse # noqa
from starlette.responses import PlainTextResponse # noqa
from starlette.responses import RedirectResponse # noqa
from starlette.responses import Response # noqa
from starlette.responses import StreamingResponse # noqa
from starlette.responses import UJSONResponse # noqa
URL重定向
用nginx来搞的话,一般配置301或者302,不过fastapi返回HTTP重定向,默认状态码为307(临时重定向)。
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
app = FastAPI()
@app.get("/blog")
go_to_blog():
return RedirectResponse("https://blog.cnrainbird.com")
curl查看
curl -I -XGET http://0.0.0.0:8001/blog
HTTP/1.1 307 Temporary Redirect
date: Sat, 17 Oct 2020 07:52:01 GMT
server: uvicorn
location: https://blog.cnrainbird.com
transfer-encoding: chunked
输出纯文本
这次用到的是PlainTextResponse,直接打印个Hello world吧
from fastapi import FastAPI
from fastapi.responses import PlainTextResponse
app = FastAPI()
@app.get("/", response_class=PlainTextResponse)
def main():
return "Hello World"
输出文件
这次选手叫:FileResponse异步流式输出一个文件。
不同于其他返回,FileResponse可以传入更多参数:
path - 文件路径
headers - 定制头信息,字典格式
media_type - media type,如果没有设置则会根据文件名或文件路径来推断media type
filename - 文件名。如果设置,会被包含到response的Content-Disposition中
文件response会包含合适的Content-Length, Last-Modified 以及 ETag 头信息内容。
示例
from fastapi import FastAPI
from fastapi.responses import FileResponse
some_file_path = "large-video-file.mp4"
app = FastAPI()
@app.get("/")
def main():
return FileResponse(some_file_path)
定制默认类
比如,我们不想每次return时都再写类型,想直接全局定义返回文本怎么呢?
from fastapi import FastAPI
from fastapi.responses import PlainTextResponse
app = FastAPI(default_response_class=PlainTextResponse)
@app.get("/")
def main():
return "Hello World"
结语
还有一些其它的类型,大同小异,不一一演示了.弄了一个微信群欢迎正常学习fastapi的朋友扫码加入.
转载请注明: 转自Rainbird的个人博客 本文链接: Python|fastapi输出定制(四)