FastAPI接口参数验证失效问题求助
问题
我正在开发基于FastAPI的应用,遇到参数验证失效问题。编写了两个带验证规则的接口:
@app.put('/camera/focus') def set_focus(value : Annotated[int, Query(gt=0)]): queue_set('camera', reader.camera, 'focus', value)
和
@app.put('/serial') def set_serial(value : Annotated[str, Query(min_length=5)]): queue_set(None, reader, 'serial', value)
当调用以下不符合规则的请求时:
http://{{base_url}}:8000/camera/focus?value=-1(focus值小于0,应不通过验证)http://{{base_url}}:8000/serial?value=XXX(参数长度过短,应不通过验证)
但两个请求均未触发验证错误,接口仍正常执行。请问是否需要手动开启FastAPI的验证功能?
另外,我通过代码启动uvicorn服务(如下),不确定是否与此相关:
if __name__ == '__main__': args = parse_cmdline() if args.log_level is not None: logging.basicConfig(format='%(levelname)s:%(name)s:%(message)s', level=name_to_level.get(args.log_level.lower(), logging.NOTSET)) else: try: logging.config.fileConfig('logging.conf') except: #fallback print("could't set logging from logging.conf file") logging.basicConfig(format='%(levelname)s:%(name)s:%(message)s', level=logging.ERROR) reader = make_reader(ScannerType[args.scanner_type.upper()], args.sim) uvicorn.run(app, host='0.0.0.0', port=args.port, log_level=args.log_level.lower()) print('done')
这么做是因为需要在启动服务前配置硬件。
解答
FastAPI的参数验证默认自动开启,无需手动启用。你的验证失效大概率是以下原因导致:
- 缺失依赖或版本不兼容
FastAPI的验证逻辑依赖pydantic库,若未安装或版本不匹配,会导致验证不生效。执行以下命令确保依赖正确:
pip install fastapi uvicorn pydantic
若使用Pydantic v2,需保证FastAPI版本不低于0.95.2,可通过pip show fastapi pydantic查看版本,版本过低则执行升级:
pip install --upgrade fastapi pydantic
- 接口未返回响应
你的两个接口函数没有返回任何内容,可能导致验证错误触发后无法正常输出错误响应。修改接口添加返回语句,例如:
@app.put('/camera/focus') def set_focus(value : Annotated[int, Query(gt=0)]): queue_set('camera', reader.camera, 'focus', value) return {"status": "success", "focus": value} @app.put('/serial') def set_serial(value : Annotated[str, Query(min_length=5)]): queue_set(None, reader, 'serial', value) return {"status": "success", "serial": value}
验证失败时,FastAPI会自动返回包含错误信息的422响应。
- 启动方式不影响验证
你通过代码启动uvicorn的方式完全正常,和验证失效无关,这种启动方式能正常触发FastAPI所有内置功能。
内容的提问来源于stack exchange,提问作者Neil Benn
相关产品推荐
相关产品推荐

