FastAPI get_current_user依赖抛出422不可处理实体错误求助
问题分析与解决方案
核心问题
你的422错误并非来自get_current_user依赖,而是路由匹配顺序导致的参数解析失败。错误提示里的loc: ["path", "user_id"]明确说明:请求/users/me时,FastAPI将me当作了/{user_id}路由中的user_id参数,而user_id被定义为int类型,字符串me无法转换为整数,因此抛出类型错误。
原因解释
FastAPI的路由匹配遵循定义顺序优先原则:如果先定义了@router.get("/{user_id}"),再定义@router.get("/me"),所有类似/users/xxx的请求都会优先尝试匹配/{user_id}路由。当请求/users/me时,me会被当作user_id的参数值触发整数校验失败,直接返回422错误——这也解释了为什么你调试get_current_user时逻辑正常,但实际请求却报错。
解决方案
方案1:调整路由定义顺序
将/me的路由定义放在/{user_id}路由前面,让精确匹配的路径优先被命中:
# 先定义/me路由 @router.get("/me") def get_user_me(current_user = Depends(get_current_user)): return current_user # 再定义带参数的/{user_id}路由 @router.get("/{user_id}", status_code=status.HTTP_200_OK) def get_user(user_id: int, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user)): user = crud.get_user(db, user_id) return user
方案2:给参数添加类型约束
在/{user_id}路由中用路径转换器明确限制参数为整数,非整数路径会跳过该路由,继续匹配/me:
@router.get("/{user_id:int}", status_code=status.HTTP_200_OK) def get_user(user_id: int, db: Session = Depends(get_db), current_user: models.User = Depends(get_current_user)): user = crud.get_user(db, user_id) return user
额外优化建议
虽然不是当前错误的原因,但返回SQLAlchemy模型实例时,数据库会话已在get_db的finally块中关闭,模型会进入脱管状态,可能引发序列化异常。建议使用Pydantic响应模型规范返回格式:
from pydantic import BaseModel class UserResponse(BaseModel): id: int username: str name: str | None surname: str | None email: str class Config: orm_mode = True # 修改端点指定响应模型 @router.get("/me", response_model=UserResponse) def get_user_me(current_user = Depends(get_current_user)): return current_user
内容的提问来源于stack exchange,提问作者Aleksander Niemirka
相关产品推荐
相关产品推荐

