Flask-Pydantic官方文档:https://github.com/bauerji/flask-pydantic#basic-example
python类型注释的数据校验和设置管理
pydantic在运行时强制执行类型提示,并在数据无效时提供友好的错误
换句话说,pydantic保证输出模型的类型和约束,而不是输入数据
在pydantic中定义对象的主要方法是通过继承自BaseModel类的模型
pydantic官方文档:https://pydantic-docs.helpmanual.io/
安装
pip3 install Flask-Pydantic
URL路径参数(Query请求参数)
其中get方法中的query参数相当于解析request对象query_params属性获得的参数
from flask import jsonify, make_response, requestfrom flask_restful import Resource, abortfrom logzero import loggerfrom utils.app import DBfrom flask_pydantic import validatefrom pydantic import BaseModelfrom typing import Optionalclass QueryModel(BaseModel):"""路径参数模型"""index: intclass ResponseModel(BaseModel):"""响应参数模型"""id: intindex: intnickname: Optional[str]class RequestBodyModel(BaseModel):"""请求体模型"""name: strnickname: Optional[str]class PydanticApi(Resource):@validate(response_many=True)def get(self, query: QueryModel, body: RequestBodyModel, on_success_status=201):"""query:解析请求参数,body:解析请求体,on_success_status: 控制请求成功的状态码,默认为200,response_many参数设置为True可以序列化多个模型"""return [ResponseModel(id=0,index=query.index,nickname="zaygww"),ResponseModel(id=2,index=query.index,nickname="zaygw")]@validate(request_body_many=True)def post(self, query: QueryModel, body: RequestBodyModel):"""query:解析请求参数,body:解析请求体,on_success_status: 控制请求成功的状态码,默认为200,response_many参数设置为True可以序列化多个模型request_body_many参数设置为True可以以传入列表类型的请求参数eg:[{"name": "name","nickname": "nickname"},{"name": "name2","nickname": "nickname2"},{"name": "name3","nickname": "nickname3"}]"""# return RequestBodyModel(**request.body_params[request.query_params.index].dict())logger.info(f"RequestBodyModel(**body[query.index].dict()): {RequestBodyModel(**body[query.index].dict())}")return RequestBodyModel(**body[query.index].dict())"""请求:curl --location --request GET 'http://10.138.35.88:5000/pydantic_test?index=1' \--header 'User-Agent: Apipost client Runtime/+https://www.apipost.cn/' \--header 'Content-Type: application/json' \--data '{"name": "name","nickname": "nickname"}'响应结果:[{"id": 0, "index": 1, "nickname": "zaygww"}, {"id": 2, "index": 1, "nickname": "zaygw"}]"""
Body请求体
上述例子get方法中的body参数相当于解析request对象body_params属性获得的参数
⚠️注意事项
- validate必须作为restful方法的第一个装饰器
- 该扩展目前只支持Content-Type = application/json的请求体,即不支持表单数据
- validate其他参数解析: ```python on_success_status:设置请求成功的状态码,默认为200 response_many参数设置为True可以序列化多个模型 request_body_many参数设置为True可以以传入列表类型的请求参数 FLASK_PYDANTIC_VALIDATION_ERROR_STATUS_CODE:设置validate装饰器验证失败的统一状态码 “”” eg:
from dataclasses import dataclass # 定义数据类
@dataclass class Config: FLASK_PYDANTIC_VALIDATION_ERROR_STATUS_CODE: int = 422
加载配置文件
app.config.from_object(Config) “”” ```
