Python 如何在FastAPI中更新请求参数
我正在使用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
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)