FastAPI注册接口出现422 Unprocessable Entity错误求助
FastAPI 422错误排查与修复
核心问题:请求格式不匹配
你的/register接口通过Form(...)声明接收表单格式参数,但Postman发送的是JSON格式的请求体,FastAPI无法解析该格式,直接返回422错误。
- 修复方案二选一:
- 调整Postman请求方式:切换到
Body标签下的form-data选项,添加username和password键值对发送 - 修改接口参数为接收JSON:用
UsersSchema作为请求模型,去掉Form依赖:@app.post("/register") async def register(user: UsersSchema, conn: Connection = Depends(get_db)): # 使用user.username和user.password获取参数
- 调整Postman请求方式:切换到
其他导致异常的问题
1. CORS中间件限制POST请求
当前CORSMiddleware仅允许GET方法,POST请求会被拦截,加剧请求异常:
app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=['GET', 'POST'], # 新增POST方法 allow_headers=['Content-Type','application/json'] )
2. 数据库操作代码错误
conn.execute(print(...))完全无效:print返回None,等于让数据库执行空指令,正确写法是直接传递SQL(推荐参数化查询避免SQL注入):from sqlalchemy import text # 插入数据(id自增,无需手动传入) conn.execute(text("INSERT INTO users (username, password) VALUES (:username, :password)"), {"username": username, "password": password}) conn.commit() # 必须提交事务才会写入数据库 # 查询示例 result = conn.execute(text("SELECT * FROM users WHERE username = :username"), {"username": username}) new_user = result.fetchone()- 类型标注错误:
get_db返回的是数据库连接(Connection类型),但接口参数标注为LegacyCursorResult,需修正:from sqlalchemy.engine import Connection async def register(username: str = Form(...), password: str = Form(...), conn: Connection = Depends(get_db)):
3. Response Model设置不合理
response_model=List[UsersSchema]要求返回用户列表,但注册接口应返回单个新用户或成功状态,该设置会导致返回数据不匹配:
- 若需返回新用户,改为
response_model=UsersSchema并返回查询到的新用户;或直接返回状态提示:@app.post("/register") async def register(...): # 插入逻辑... return {"status": "success", "message": "注册成功"}
额外安全建议
- 禁止明文存储密码,使用
passlib等库对密码进行哈希加密后再存入数据库 - 优先使用SQLAlchemy ORM操作(如
db.add(Users(username=xxx, password=xxx)))代替原生SQL,降低出错概率与安全风险
内容的提问来源于stack exchange,提问作者Pratham Sampat
相关产品推荐
相关产品推荐

