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

FastAPI中能否混合使用Pydantic BaseModel与Starlette Request实现限流?

问题原因

报错核心原因是错误使用多继承混合Pydantic BaseModel和Starlette Request类,违背了FastAPI的参数解析规则:

  1. FastAPI对参数类型有明确的分发逻辑:当参数类型为Request及其子类时,框架会直接注入原生的Starlette请求对象,不会对POST请求的JSON体做Pydantic序列化,你拿到的request本质是原生请求实例,自然不存在hash等你自定义的字段。
  2. Pydantic BaseModel和Starlette Request的初始化逻辑完全不兼容,多继承无法实现「同时拿到限流需要的请求对象和序列化后的请求体」的需求。
解决方案

完全不需要做继承改造,将限流需要的Request对象和请求体Pydantic模型拆分为两个独立的路由参数即可:
首先修正HashRequest的定义,仅继承BaseModel:

class HashRequest(BaseModel):
    hash: str
    type: Optional[HashType] = None
    min_length: Optional[int] = None
    max_length: Optional[int] = None
    special_chars: Optional[bool] = None

然后修改路由函数的参数声明,单独声明Request类型参数给slowapi使用,请求体单独用HashRequest接收:

@app.post("/")
@limiter.limit("10/minute")
@limiter.limit("100/hour")
async def send_hash(request: Request, hash_request: HashRequest):
    ## TODO: communicate with backend
    return {"message":"request recieved", "hash":hash_request.hash}

修改完成后重新启动服务,你之前使用的curl请求就可以正常返回结果,同时slowapi的限流规则也会正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:01