FastAPI自定义路由类:如何获取路由函数的所有输入参数
FastAPI自定义路由类中获取路由函数输入参数及默认值
可以在自定义APIRoute类中获取路由函数的输入参数,包括未传入参数时的默认值。核心思路是利用inspect模块提取路由函数的参数签名,结合FastAPI的请求解析能力获取最终参数值。
实现步骤及代码示例
导入inspect模块后,在自定义路由类中通过self.endpoint绑定目标路由函数,再提取参数信息并结合请求内容处理:
from typing import List, Callable, Dict, Any from fastapi import Body, FastAPI, Request, Response from fastapi.routing import APIRoute import inspect class CustomRoute(APIRoute): def get_route_handler(self) -> Callable: original_route_handler = super().get_route_handler() # 获取当前路由绑定的处理函数 route_func = self.endpoint # 提取函数的参数签名 sig = inspect.signature(route_func) params = sig.parameters async def custom_route_handler(request: Request) -> Response: # 1. 收集所有参数的默认值 default_values = {} for name, param in params.items(): if param.default is not inspect.Parameter.empty: default_values[name] = param.default # 2. 解析请求中的实际参数(以POST请求体为例) request_params = {} if request.method == "POST": request_params = await request.json() elif request.method == "GET": request_params = dict(request.query_params) # 3. 合并默认值与实际参数,得到最终参数集合 final_params = {**default_values, **request_params} # 此处可对参数进行自定义处理 print("最终参数集合:", final_params) _r = await original_route_handler(request) return _r return custom_route_handler def create_app(): app = FastAPI() app.router.route_class = CustomRoute return app app = create_app() @app.post("/sum") async def sum_numbers(numbers: List[int] = Body(), things: str = "stuff"): return {"sum": sum(numbers), "things": things}
关键说明
self.endpoint:APIRoute类的内置属性,直接指向当前路由绑定的处理函数(如示例中的sum_numbers)。inspect.signature:用于获取函数的参数签名,通过遍历参数可判断是否存在默认值(param.default不等于inspect.Parameter.empty即为有默认值)。- 请求参数解析:根据请求方法区分参数来源(POST取请求体、GET取查询参数),再与默认值合并,即可得到包含默认值的最终参数集合。
内容的提问来源于stack exchange,提问作者codeAndStuff
相关产品推荐
相关产品推荐

