在开发项目时打算使用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倍。
发表回复