FastAPI中能否混合使用Pydantic BaseModel与Starlette Request实现限流?
问题原因
报错核心原因是错误使用多继承混合Pydantic BaseModel和Starlette Request类,违背了FastAPI的参数解析规则:
- FastAPI对参数类型有明确的分发逻辑:当参数类型为
Request及其子类时,框架会直接注入原生的Starlette请求对象,不会对POST请求的JSON体做Pydantic序列化,你拿到的request本质是原生请求实例,自然不存在hash等你自定义的字段。 - 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
相关产品推荐
相关产品推荐

