如何在路由装饰器中获取Request对象,无需在路由函数显式声明
在FastAPI装饰器中无需路由显式传参获取Request对象的方法
你可以利用FastAPI底层Starlette框架的上下文变量特性,直接在装饰器中获取当前请求对象,无需给每个路由函数添加request: Request参数。
具体实现代码
from functools import wraps from fastapi import Request def decorator_func(...): def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): # 核心:从上下文获取当前Request对象 request = Request.get_current() # 这里可对request做任意操作,比如获取请求路径、请求头等 print(f"请求路径: {request.url.path}") print(f"请求头信息: {dict(request.headers)}") return await func(*args, **kwargs) return wrapper return decorator
路由使用示例
@router.get(path='/something') @decorator_func(...) def get_something(...): # 无需声明request参数 return {"status": "success", "data": "content"}
原理说明
FastAPI/Starlette会将当前请求对象存储在协程安全的上下文变量(contextvar)中,Request.get_current()方法会自动从这个上下文变量里提取当前请求实例,不管路由函数有没有显式接收request参数,装饰器都能正常获取到。该方法同时支持同步与异步路由函数。
内容的提问来源于stack exchange,提问作者Steph
相关产品推荐
相关产品推荐

