【问题标题】:FastAPI handling camelCase and PascalCase same timeFastAPI同时处理camelCase和PascalCase
【发布时间】:2022-07-22 14:53:35
【问题描述】:

如何在 FastAPI 应用程序中同时处理 PascalCase 和 camelCase 请求体到 snake_case? 我尝试使用中间件和routerHandler将camelCase替换为PascalCase,但效果不太好。

class CustomRouteHandler(APIRoute):

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

        async def custom_route_handler(request: Request) -> Response:
            route_path = request.url.path
            body = await request.body()
            logger.info({"path": request.url.path, "request": request._body.decode("utf-8")})
            if body:
                body = ujson.dumps(humps.pascalize(ujson.loads(body.decode("utf-8")))).encode("ascii")
            request._body = body
            try:
                return await original_route_handler(request)
            except ValidationError as e:
                logger.exception(e, exc_info=True)
                return UJSONResponse(status_code=200, content={"Success": False, "Message": e})
            
        return custom_route_handler

router = APIRouter(prefix="/payments", route_class=CustomRouteHandler)

当我记录此代码时,一切正常。但它返回 ValidationError:

request body: {"test": 12345}
logger after pascalize: {"Test": 12345}
ERROR: 1 validation error for Request\nbody -> Test 
none is not an allowed value (type=type_error.none.not_allowed)

【问题讨论】:

    标签: python python-requests fastapi


    【解决方案1】:

    首先你应该明白,当我们在API请求中使用CamelCase时,请求体默认会转换成字符串。所以,如果你想同时处理 camelCase 和 PascalCase,你需要同时处理这两种情况。最简单的方法是添加两条路线 - 每种情况一条。例如:

    class CustomRouteHandler(APIRoute): def get_route_handler(self) -> Callable: original_route_handler = super().get_route_handler() async def custom_route_handler(request: Request) -> Response: route_path = request.url.path body = await request.body() logger.info(\"Path\": request.url.path, \"Request\": request._body.decode("utf-8")) if body: body = ujson.dumps(humps.pascalize(ujson.loads(body.decode("utf-8")))).encode("ascii") request._body = body try: return await original_route_handler(request) except ValidationError as e: logger.exception(e, exc_info=True) return UJSONResponse(status_code=200, content=\"Success\", "Message": e) return custom_route_handler router = APIRouter(prefix="/payments", route_class=CustomRouteHandler)
    

    然后您可以创建一个处理这两种情况的中间件:

    middleware = RouterMiddleware(prefix="/payments", route_class="custom_route_handler")
    

    然后您可以在主路由中使用自定义路由处理程序:

    main_routes = Routes.new(Router())

    您可以在官方文档页面上查看更多示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多