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
相关产品推荐
相关产品推荐

