FastAPI多个路由绑定同一函数,如何判断请求的路由?
解决方案
方法1:使用FastAPI原生的Request对象(最简便原生方案)
直接在路由函数中注入Request对象,通过request.url.path即可直接获取当前调用的路由路径,代码简洁且无需额外封装:
from fastapi import FastAPI, Request app = FastAPI() @app.get('/api/') @app.get('/api/test') def main_route(request: Request): used_route = request.url.path # 这里可以根据used_route做逻辑处理 print(f"当前调用的路由: {used_route}") return {"used_route": used_route}
方法2:自定义装饰器绑定路由标识(无需注入Request)
如果觉得注入Request不够直观,可以自定义一个装饰器,给每个路由绑定对应的路径参数,直接在函数参数中获取:
from fastapi import FastAPI import functools app = FastAPI() # 自定义装饰器,用于传递当前路由路径 def bind_route(route_path): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): kwargs["used_route"] = route_path return func(*args, **kwargs) return wrapper return decorator # 给每个路由分别绑定对应的路径 @bind_route('/api/') @app.get('/api/') @bind_route('/api/test') @app.get('/api/test') def main_route(used_route: str): print(f"当前调用的路由: {used_route}") return {"used_route": used_route}
方法3:通过路由名称映射(适合需用路由名称的场景)
给每个路由指定唯一的name属性,然后通过request.scope获取路由名称,再映射回实际路径。这种方法适合需要用路由名称而非路径做逻辑判断的场景,但需要维护路由名称与路径的映射表:
from fastapi import FastAPI, Request app = FastAPI() # 维护路由名称与路径的映射 ROUTE_MAP = { "root_api": "/api/", "test_api": "/api/test" } @app.get('/api/', name="root_api") @app.get('/api/test', name="test_api") def main_route(request: Request): route_name = request.scope["route"].name used_route = ROUTE_MAP.get(route_name) print(f"当前调用的路由: {used_route}") return {"used_route": used_route}
内容的提问来源于stack exchange,提问作者Aleksander Ikleiw
相关产品推荐
相关产品推荐

