Python 如何在FastAPI中更新请求参数

Python 如何在FastAPI中更新请求参数,python,request,fastapi,starlette,Python,Request,Fastapi,Starlette,我正在使用FastAPI,我想定义一个中间件,在这个中间件中,我可以截获前端传递的加密参数并对其进行解密,然后用解密的参数替换原始参数,我应该怎么做? 我试过了 body = await request.body() request._body = body async def set_body(request: Request, body: bytes): async def receive() -> Message: return {"type&qu

我正在使用FastAPI,我想定义一个中间件,在这个中间件中,我可以截获前端传递的加密参数并对其进行解密,然后用解密的参数替换原始参数,我应该怎么做? 我试过了

body = await request.body()
request._body = body
async def set_body(request: Request, body: bytes):
    async def receive() -> Message:
        return {"type": "http.request", "body": body}

    request._receive = receive

async def get_body(request: Request) -> bytes:
    body = await request.body()
    set_body(request, body)
    return body
我也试过了

body = await request.body()
request._body = body
async def set_body(request: Request, body: bytes):
    async def receive() -> Message:
        return {"type": "http.request", "body": body}

    request._receive = receive

async def get_body(request: Request) -> bytes:
    body = await request.body()
    set_body(request, body)
    return body
但是仍然没有解决方案,谁能给这个问题一个解决方案,非常感谢

=========================================================================

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.router.route_class = GzipRoute
我也测试了这个方法,但仍然不起作用

==============================================================

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.router.route_class = GzipRoute

我通过app.router.route\u class=gzip路由解决了这个问题, 主要提示:在另一个类中定义路由时,还需要创建路由类,例如:

router = APIRouter(route_class=GzipRoute)

我已经通过app.router.route_class=GzipRoute解决了这个问题,主要提示:在另一个类中定义路由时,还需要创建一个路由类,例如:router=APIRouter(route_class=GzipRoute)