赞
踩
在开发项目时打算使用jinja渲染html后,导出为图片并传输到客户端中。
根据官方网站应该使用StreamingResponse返回体返回任何字节文件。
示例代码如下:
- import uvicorn
- from fastapi import FastAPI, Request
- from fastapi.responses import StreamingResponse
-
- app = FastAPI()
-
- @app.get("/")
- async def read_root(request: Request):
- with open('image.png','rb') as image:
- return StreamingResponse(io.BytesIO(image), media_type="image/png")
-
- if __name__ == "__main__":
- uvicorn.run("main:app", port=8000, reload=True)
在互联网搜索相关教程大多会使用io.BytesIO()
传输字节文件,但经过实验发现,获得一张约2MB的图片传输时间需要3.18秒
并且这还是在内网的环境下,传输未免有些过慢了。
那可以尝试使用yield
来优化传输速度:
- import uvicorn
- from fastapi import FastAPI, Request
- from fastapi.responses import StreamingResponse
-
- app = FastAPI()
-
- @app.get("/")
- async def read_root(request: Request):
- with open('image.png','rb') as image:
- def iterfile():
- yield image
- return StreamingResponse(iterfile(), media_type="image/png")
-
- if __name__ == "__main__":
- uvicorn.run("main:app", port=8000, reload=True)
优化后的效果如下:
除1.9秒服务器制图的时间外,2MB的图片传输仅需0.14秒即可完成。相对于io.BytesIO()
传输方式,传输速度提速了22倍。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。