不校验参数会导致运行时keyerror、typeerror等错误,定位困难;应使用pydantic v2的basemodel配合.model_validate()做自动类型转换、必填判断和边界检查,并注意multidict转换、文件单独处理、错误格式化输出及strict模式控制。

Flask接口里不校验参数会出什么问题
直接拿 request.json 或 request.args 用,等于把数据合法性完全交给前端——实际部署后,KeyError、TypeError、空字符串当数字用、字段类型错乱(比如传了字符串 "null" 却期待 None)全都会在运行时炸出来,而且错误堆栈还藏得深,定位慢。
用 Pydantic v2 的 BaseModel 做请求体校验
别写一堆 if not x or not isinstance(x, int),Pydantic 能自动做类型转换 + 必填判断 + 边界检查。关键点是:必须用 .model_validate()(v2 新 API),不是旧版的 .parse_obj()。
常见错误现象:ValidationError 报错但没看到具体字段名 —— 因为没开 error_msg_templates 或没捕获异常并格式化输出。
- 定义模型时,用
Field(default=...)控制可选/默认值,别依赖Optional[]加= None混用 - 对字符串长度限制,用
Field(min_length=1, max_length=50),比手动len(s) > 50更早拦截 - 接收 JSON 数组时,模型字段声明为
List[int]或list[dict](v2 支持原生类型注解) - 如果要兼容空字符串转
None,加default_factory=lambda: None并配合validate_default=True
Query 参数和 Form 表单怎么校验
request.args 和 request.form 是 MultiDict,不能直接丢给 BaseModel.model_validate()。得先转成 dict,但要注意:MultiDict 里同 key 多值(如 tags=a&tags=b)会被覆盖成单个值。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
使用场景:搜索接口带多个 filter 参数、上传表单含文件 + 元数据。
- 查 query 参数:用
dict(request.args),但若需多值支持,得手动取request.args.getlist('tags')再塞进字典 - 处理 form:用
request.form.to_dict(flat=False)得到 {key: [val]} 结构,再按需展开或保留列表 - 文件上传字段不能放 Pydantic 模型里校验——
FileStorage类型不被支持,得单独用request.files.get('image')判断 - 所有非 JSON 请求体,校验前务必调用
.model_validate()的from_attributes=False(默认就是 False,但显式写上更稳)
怎么把校验逻辑塞进 Flask 路由里不写重复代码
别每个 @app.route 都写一遍 try...except ValidationError。用装饰器或中间件太重,推荐封装一个轻量函数,在路由内部调用。
性能影响:Pydantic 校验本身很快,但模型类每次调用都实例化——只要模型类定义在模块顶层(不是函数内动态建),就没额外开销。
- 写个工具函数
parse_request(model_cls, source='json'),根据source自动选request.json/dict(request.args)/request.form.to_dict() - 捕获
ValidationError后,用exc.errors(include_url=False, include_context=False)提取干净字段错误,返回 422 + JSON - 别在模型里写复杂
@field_validator去查数据库——那属于业务逻辑,应该在校验通过后、进业务函数前做 - 开发期建议开启
model_config = ConfigDict(extra='forbid'),防止前端多传字段悄悄被忽略
最易被忽略的是:Pydantic 默认把 "123" 自动转成 int,但如果你的业务要求“必须传数字字面量”,就得关掉自动转换,用 strict=True 配合 int 注解。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










