Flask-Pydantic官方文档:https://github.com/bauerji/flask-pydantic#basic-example


python类型注释的数据校验和设置管理
pydantic在运行时强制执行类型提示,并在数据无效时提供友好的错误
换句话说,pydantic保证输出模型的类型和约束,而不是输入数据
在pydantic中定义对象的主要方法是通过继承自BaseModel类的模型
pydantic官方文档:https://pydantic-docs.helpmanual.io/

安装

  1. pip3 install Flask-Pydantic

URL路径参数(Query请求参数)

其中get方法中的query参数相当于解析request对象query_params属性获得的参数

  1. from flask import jsonify, make_response, request
  2. from flask_restful import Resource, abort
  3. from logzero import logger
  4. from utils.app import DB
  5. from flask_pydantic import validate
  6. from pydantic import BaseModel
  7. from typing import Optional
  8. class QueryModel(BaseModel):
  9. """路径参数模型"""
  10. index: int
  11. class ResponseModel(BaseModel):
  12. """响应参数模型"""
  13. id: int
  14. index: int
  15. nickname: Optional[str]
  16. class RequestBodyModel(BaseModel):
  17. """请求体模型"""
  18. name: str
  19. nickname: Optional[str]
  20. class PydanticApi(Resource):
  21. @validate(response_many=True)
  22. def get(self, query: QueryModel, body: RequestBodyModel, on_success_status=201):
  23. """
  24. query:解析请求参数,
  25. body:解析请求体,
  26. on_success_status: 控制请求成功的状态码,默认为200,
  27. response_many参数设置为True可以序列化多个模型
  28. """
  29. return [
  30. ResponseModel(
  31. id=0,
  32. index=query.index,
  33. nickname="zaygww"
  34. ),
  35. ResponseModel(
  36. id=2,
  37. index=query.index,
  38. nickname="zaygw"
  39. )
  40. ]
  41. @validate(request_body_many=True)
  42. def post(self, query: QueryModel, body: RequestBodyModel):
  43. """
  44. query:解析请求参数,
  45. body:解析请求体,
  46. on_success_status: 控制请求成功的状态码,默认为200,
  47. response_many参数设置为True可以序列化多个模型
  48. request_body_many参数设置为True可以以传入列表类型的请求参数
  49. eg:
  50. [
  51. {
  52. "name": "name",
  53. "nickname": "nickname"
  54. },
  55. {
  56. "name": "name2",
  57. "nickname": "nickname2"
  58. },
  59. {
  60. "name": "name3",
  61. "nickname": "nickname3"
  62. }
  63. ]
  64. """
  65. # return RequestBodyModel(**request.body_params[request.query_params.index].dict())
  66. logger.info(f"RequestBodyModel(**body[query.index].dict()): {RequestBodyModel(**body[query.index].dict())}")
  67. return RequestBodyModel(**body[query.index].dict())
  68. """
  69. 请求:
  70. curl --location --request GET 'http://10.138.35.88:5000/pydantic_test?index=1' \
  71. --header 'User-Agent: Apipost client Runtime/+https://www.apipost.cn/' \
  72. --header 'Content-Type: application/json' \
  73. --data '
  74. {
  75. "name": "name",
  76. "nickname": "nickname"
  77. }
  78. '
  79. 响应结果:
  80. [{"id": 0, "index": 1, "nickname": "zaygww"}, {"id": 2, "index": 1, "nickname": "zaygw"}]
  81. """

Body请求体

上述例子get方法中的body参数相当于解析request对象body_params属性获得的参数
image.png

⚠️注意事项

  1. validate必须作为restful方法的第一个装饰器
  2. 该扩展目前只支持Content-Type = application/json的请求体,即不支持表单数据
  3. 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) “”” ```