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

如何为FastAPI的Request类添加类方法并实现重载?

如何在FastAPI中自定义Request类?

你的问题出在:FastAPI(底层依赖Starlette)默认会创建starlette.requests.Request实例,即使你在路由参数里标注自定义的MyPersonalRequest,框架也不会自动替换原生Request对象,因此调用自定义方法时会出现属性错误。

下面提供两种可行的解决方案:

方案一:依赖注入包装原生Request(推荐,灵活可控)

这种方式不需要继承原生Request,而是通过依赖注入将原生Request包装到自定义类中,既能添加自定义方法,也能保留原生Request的所有功能。

from fastapi import Request, APIRouter, Depends

router = APIRouter()

class MyPersonalRequest:
    def __init__(self, request: Request):
        self.request = request  # 持有原生Request实例,方便调用原生方法/属性

    def human_readable_datetime(self):
        return "some nice date/time message"

    # 可以添加更多自定义方法
    def get_client_ip(self):
        return self.request.client.host if self.request.client else "unknown"

# 定义依赖项,用于注入自定义Request对象
def get_custom_request(request: Request) -> MyPersonalRequest:
    return MyPersonalRequest(request)

@router.get('/info')
async def info(request: MyPersonalRequest = Depends(get_custom_request)):
    print(request.human_readable_datetime())
    print(request.get_client_ip())
    # 访问原生Request的属性和方法
    print(request.request.method)
    print(request.request.url)

方案二:全局替换Request类(适合全项目统一使用)

如果需要所有请求都自动使用自定义的Request类,可以在创建FastAPI应用时指定request_class参数,注意必须正确继承Starlette的Request类并实现正确的构造方法。

from fastapi import FastAPI, APIRouter
from starlette.requests import Request as StarletteRequest

router = APIRouter()

class MyPersonalRequest(StarletteRequest):
    def human_readable_datetime(self):
        return "some nice date/time message"

    # 必须保留原生Request的构造参数,否则框架无法初始化实例
    def __init__(self, scope, receive=None):
        super().__init__(scope, receive)

# 创建应用时指定自定义Request类
app = FastAPI(request_class=MyPersonalRequest)

@router.get('/info')
async def info(request: MyPersonalRequest):
    print(request.human_readable_datetime())
    print(type(request))  # 输出:<class '__main__.MyPersonalRequest'>

app.include_router(router)

原代码失败的核心原因

  1. 自定义类的__init__方法没有接收原生Request必需的scope和receive参数,无法被框架正确实例化
  2. 没有告诉FastAPI使用自定义的Request类,框架依然创建原生Starlette Request实例

内容的提问来源于stack exchange,提问作者Ricky Levi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:42:55