如何在 FastAPI 中更新请求参数

问题描述

我用的是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

但是还是没有解决办法,有没有人能给出解决方法,非常感谢!

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

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_class = GzipRoute解决了这个问题, 主要提示:在另一个类中定义路由时,还需要制作一个路由类,例如:

router = APIRouter(route_class=GzipRoute)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...