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

FastAPI GET端点报错:user_id非有效整数(POST方法正常)

FastAPI中GET请求JWT端点触发未定义的user_id验证错误

我在FastAPI中实现JWT Token功能,尝试创建一个从access_token提取用户名等用户数据的端点。最初将端点设为GET方法时,持续出现以下错误:

{
  "detail": [
    {
      "loc": [
        "path",
        "user_id"
      ],
      "msg": "value is not a valid integer",
      "type": "type_error.integer"
    }
  ]
}

经过测试发现,将方法改为POST时端点可正常工作——哪怕POST请求不发送任何数据,token也能正确传递。调试时发现端点会立即抛出错误:

"Exception has occurred: RequestValidationError
1 validation error for Request
path -> user_id
  value is not a valid integer (type=type_error.integer)
  File "/home/travers/projects/PRMS-api/PRMS/db/db_setup.py", line 38, in get_db
    yield db
fastapi.exceptions.RequestValidationError: 1 validation error for Request
path -> user_id
  value is not a valid integer (type=type_error.integer)"

更奇怪的是,我并未在任何路径或依赖项中定义user_id参数。以下是相关代码:

端点定义(问题出在使用GET方法时)

router = fastapi.APIRouter(prefix="/users", tags=["Users"])
oauth_schema = OAuth2PasswordBearer(tokenUrl="/users/login")

...

@router.get("/info", status_code=status.HTTP_200_OK)
async def get_info(token: str = Depends(oauth_schema)):
    try:
        print("Received token:", token)
        payload = get_current_user(token)
        print("Decoded payload:", payload)

        if payload.get("user_name") is None:
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Invalid token",
            )

        return {"payload": payload}
    except JWTError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid token",
        )

get_current_user函数定义(auth_handler模块)

负责生成token、哈希密码等功能,该函数用于解析token:

def get_current_user(token: str):
    payload = jwt.decode(token, JWT_SECRET_KEY, algorithms=[ALGORITHM])
    user_name = payload.get("sub", None)
    user_role = payload.get("role", None)
    return {"user_name": user_name, "user_role": user_role}

get_db依赖代码

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


DB_URL = "postgresql+psycopg2://postgres:postgres@localhost/prmsv2"

engine = create_engine(DB_URL, connect_args={}, future=True)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True)

Base = declarative_base()


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

我已经做过这些排查:通过Python调试确认token传递正确,用Swagger和Postman测试端点,清除浏览器缓存和Cookie,多次重写函数,确认没有会引发该错误的依赖项或请求体参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:35:21