gpt4 book ai didi

python - 在 FastAPI/Uvicorn 中接受 gzipped body

转载 作者:行者123 更新时间:2023-12-04 08:29:48 25 4
gpt4 key购买 nike

我正在使用 FastAPIUvicorn实现一个接受请求正文中的 json 有效负载的 u-service。由于请求正文可能非常大,我希望服务接受 gzip 压缩。我该如何实现?

到目前为止:

  • 添加了 GZipMiddleware ,但它编码响应,而不是解码请求
  • 在我的请求中添加了“Content-Encoding: gzip”

响应失败:

Status: 400 Bad Request
{ "detail": "There was an error parsing the body" }

最佳答案

FastAPI 文档 contains自定义 gzip 编码请求类的示例。

注意:该页面还包含以下短语:“...如果您需要 Gzip 支持,您可以使用提供的 GzipMiddleware。”,但这是不正确的,因为您正确地注意到中间件仅适用于响应。

import gzip
from typing import Callable, List

from fastapi import Body, FastAPI, Request, Response
from fastapi.routing import APIRoute


class GzipRequest(Request):
async def body(self) -> bytes:
if not hasattr(self, "_body"):
body = await super().body()
if "gzip" in self.headers.getlist("Content-Encoding"):
body = gzip.decompress(body)
self._body = body
return self._body


class GzipRoute(APIRoute):
def get_route_handler(self) -> Callable:
original_route_handler = super().get_route_handler()

async def custom_route_handler(request: Request) -> Response:
request = GzipRequest(request.scope, request.receive)
return await original_route_handler(request)

return custom_route_handler


app = FastAPI()
app.router.route_class = GzipRoute


@app.post("/sum")
async def sum_numbers(numbers: List[int] = Body(...)):
return {"sum": sum(numbers)}

关于python - 在 FastAPI/Uvicorn 中接受 gzipped body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65078775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com