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, request
from flask_restful import Resource, abort
from logzero import logger
from utils.app import DB
from flask_pydantic import validate
from pydantic import BaseModel
from typing import Optional
class QueryModel(BaseModel):
"""路径参数模型"""
index: int
class ResponseModel(BaseModel):
"""响应参数模型"""
id: int
index: int
nickname: Optional[str]
class RequestBodyModel(BaseModel):
"""请求体模型"""
name: str
nickname: 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) “”” ```