You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在路由装饰器中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:22:10