使用Flask和Pydantic实现参数验证
使用Flask和Pydantic实现参数验证
1 简介
Pydantic是一个用于数据验证和解析的 Python 库,版本2的性能有较大提升,很多框架使用Pydantic做数据校验。
# 官方参考文档
https://docs.pydantic.dev/latest/# Github地址
https://github.com/pydantic/pydantic
2 使用Flask自定义参数校验
2.1 结构

2.2 源代码
app_result.py
import jsonfrom flask import jsonifydef result(data: object = None, code: int = 200, msg: str = "success"):"""Set the result of web:param data: It is data of status:param code: It is code of status:param msg: It is a message of status:return: dict"""# 将对象转化为json字符串data_json_str = json.dumps(data, ensure_ascii=False, default=lambda obj: obj.__dict__)# 将json字符串转化为json字典data_json_dict = json.loads(data_json_str)# 设置返回值字典result_dict = {"code": code,"msg": msg,"data": data_json_dict}return jsonify(result_dict)
validate_request.py
from flask import request
from pydantic import ValidationErrorfrom entity.app.app_result import resultdef validate_form(form_object):# 设置含有请求参数的装饰器def inner(fun):def inner_sub():try:# 获取Content-Typecontent_type = request.content_typeif content_type is None:return result(code=400, msg="No parameters")# 验证参数form_instance = None# 获取 “application/json” 请求if "application/json" in content_type:# 获取json字典数据parameters = request.get_json(silent=True)# 将字典转化为对象form_instance = form_object(**parameters)else:# 获取 "application/x-www-form-urlencoded" 或者 "multipart/form-data" 请求等parameters = request.form.to_dict()# 将字典转化为对象form_instance = form_object(**parameters)# print(parameters)return fun(form_instance)except ValidationError as e:print(e.json())# 存储错误参数列表parameters_invalid = list()# 处理参数for error in e.errors():parameters_invalid.append({"attr": error.get("loc")[0],"msg": error.get("msg")})return result(parameters_invalid, code=400, msg="The parameter is invalid")# 更改视图名称inner_sub.__name__ = fun.__name__return inner_subreturn inner
data_form.py
from typing import Optionalfrom pydantic import BaseModel, Field, field_validatorclass DataForm(BaseModel):# Python中"..."3个点是Ellipsis对象,主要用于切片操作和类型注解# pydantic中Field的"..."3个点表示必填项name: str = Field(..., title="The name of the item", description="deldldlddl", max_length=5)desc: Optional[str] = Field(..., title="The description of the item", max_length=2)price: float = Field(..., title="The price of the item", ge=0.01)"""# 如果不使用Field设置验证参数,可以使用@field_validator注解# 自定义验证器@field_validator('price')# cls是一个用于类方法的参数,代表类本身def age_must_be_positive(cls, v):if v < 0:raise ValueError('年龄不能为负数')return v"""
index.py
from flask import Flask, Blueprintfrom test.data_form import DataForm
from entity.form.validate_request import validate_formapp = Flask(__name__)# 构建蓝本
admin = Blueprint("admin", __name__)@admin.route("/info")
@validate_form(DataForm)
def info(info_form: DataForm):print(info_form.name)print(info_form.desc)return "Hello Admin"@admin.route("/msg")
@validate_form(DataForm)
def msg(msg_form: DataForm):print(msg_form)return "Hello Admin"# 注册蓝本
app.register_blueprint(admin, url_prefix='/admin')if __name__ == '__main__':app.run(host='0.0.0.0', debug=True)
2.3 返回值

相关文章:
使用Flask和Pydantic实现参数验证
使用Flask和Pydantic实现参数验证 1 简介 Pydantic是一个用于数据验证和解析的 Python 库,版本2的性能有较大提升,很多框架使用Pydantic做数据校验。 # 官方参考文档 https://docs.pydantic.dev/latest/# Github地址 https://github.com/pydantic/pyd…...
python_在钉钉群@人员发送消息
python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南,适用于群机器人接收消息,处理完一系列的动作之后,将消息返回给发消息的人员,同时该人员。 需要在企微后台新建一个自建应用,在自建应用里…...
C语言之装甲车库车辆动态监控辅助记录系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 (一)…...
线性代数概述
矩阵与线性代数的关系 矩阵是线性代数的研究对象之一: 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础,而矩阵运算则简洁地表示和…...
使用 ChatGPT 生成和改进你的论文
文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具,可以帮助你…...
Linux命令行工具-使用方法
参考资料 Linux网络命令:网络工具socat详解-CSDN博客 arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别_aarch64-elf-gcc aarch64-linux-gnu-CSDN博客 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 热爱学习地派大星-CS…...
RV1126+FFMPEG推流项目(7)AI音频模块编码流程
一、AI 模块和外设麦克风的关系 AI 模块是 RV1126 芯片的一个重要组成部分。它的主要功能是将外部接入的麦克风采集到的模拟信号通过内置的驱动程序转换为数字信号。这意味着麦克风作为外设,提供音频输入信号,AI 模块通过其硬件和软件的结合,…...
四、华为交换机 STP
生成树协议(STP)的核心目的是在存在冗余链路的网络中,构建一个无环的拓扑结构,从而防止网络环路带来的广播风暴等问题 一、STP 原理 选举根桥:网络中的每台交换机都会有一个唯一的桥 ID(BID)&am…...
服务器卡顿是否等同于遭受CC攻击?
在网站运营或应用服务过程中,遇到服务器响应缓慢或者卡顿时,很多管理员的第一反应是可能遭遇了CC(Challenge Collapsar)攻击。但实际情况往往更为复杂。本文将探讨服务器卡顿与CC攻击之间的关系,并提供一些基本的排查方…...
【机器学习实战入门】使用Pandas和OpenCV进行颜色检测
Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道,并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的,它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测? 颜色检测是检测任何颜色名称的过程…...
一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建
文章目录 一文大白话讲清楚webpack基本使用——1——完成webpack的初步构建1. 先回忆webpack是个啥2. webpack四大核心2.1 Entry(入口)2.2 Output(输出)2.3 Loader(加载器)2.4 Plugin(插件) 3. 按部就班实现webpack3.1 初始化项目3.2 完成项目骨架搭建3.3 实现webpack构建 一文…...
RabbitMQ基础篇
文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式(Simple Queue)2.2 工作队列模式(Work Queues)2.3 发布/订阅模式(Publish/Subscribe)2.4 路由模式(R…...
GPT-5 传言:一场正在幕后发生的 AI 变革
新的一年,让我们从一个引人入胜的话题开始:如果我告诉你,GPT-5 并非虚构,而是真实存在呢?它不仅真实存在,而且正在你看不见的地方悄然塑造着世界。我的基本假设是:OpenAI 已经秘密开发出 GPT-5&…...
CSS布局与响应式
学习链接 Grid网格布局 前端五大主流网页布局 flex布局看这一篇就够了 grid布局看这一篇就够了 用六个案例学会响应式布局 伸缩盒响应式页面布局实战 实现响应式布局的五种方式 - csdn 如何完成响应式布局,有几种方法?看这个就够了 响应式布局总…...
C++的auto_ptr智能指针:从诞生到被弃用的历程
C作为一种功能强大的编程语言,为开发者提供了众多便捷的特性和工具,其中智能指针是其重要特性之一。智能指针能够自动管理内存,有效避免内存泄漏等常见问题。然而,并非所有智能指针都尽善尽美,auto_ptr便是其中的一个例…...
iOS - Objective-C 底层实现中的哈希表
1. 关联对象存储(AssociationsHashMap) // 关联对象的哈希表实现 typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap; typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMa…...
什么是软件架构
什么是软件架构 程序员说,软件架构是要决定编写哪些C程序或OO类、使用哪些库和框架 程序经理说,软件架构就是模块的划分和接口的定义 系统分析员说,软件架构就是为业务领域对象的关系建模 配置管理员说,软件架构就是开发出来的…...
【Golang/nacos】nacos配置的增删查改,以及服务注册的golang实例及分析
前言 本文分析的实例来源于nacos在github上的开源仓库 nacos配置的增删查改 先具体来看一段代码,我将逐步分析每一段的作用 package mainimport ("fmt""time""github.com/nacos-group/nacos-sdk-go/clients""github.com/naco…...
RabbitMQ集群安装rabbitmq_delayed_message_exchange
1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章: rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后,start_app 就会报错了 (CaseC…...
Linux UDP 编程详解
一、引言 在网络编程领域,UDP(User Datagram Protocol,用户数据报协议)作为一种轻量级的传输层协议,具有独特的优势和适用场景。与 TCP(Transmission Control Protocol,传输控制协议࿰…...
CC Switch搭建到vscode
适配 win 和 Ubuntu 下的环境cc-switch下载 通过网盘分享的文件:CC-Switch 链接: https://pan.baidu.com/s/1YthfhQSnk3S4RvajG6Ax8Q?pwd8rtr 提取码: 8rtrwin 使用 CC-Switch-v3.12.3-Windows.msiUbuntu 22 以下使用 CC-Switch-cli-linux-x64-musl.tar.gzUbuntu 2…...
告别“以刊评文”,中国顶刊《Vita》启航:一份不收费的CNS挑战者正式来了
如果有一天,发论文不用交几万块版面费,评价论文不再看影响因子;你会觉得,这是理想,还是趋势?2026年,这件事,开始变成现实。2026年的春天,中国学术界连续打出两记“重拳”…...
BepInEx终极指南:5分钟掌握Unity游戏模组开发框架
BepInEx终极指南:5分钟掌握Unity游戏模组开发框架 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想要为Unity游戏添加自定义功能却苦于技术门槛?BepInEx作…...
第三十三课:LIF神经元模型与SpikingJelly实战解析
1. LIF神经元模型:从生物启发的数学原理说起 第一次看到LIF(Leaky Integrate-and-Fire)神经元时,我脑海中浮现的是中学物理课上那个总在漏电的电容器。这种神经元模型之所以被称为"漏电积分放电",正是因为它…...
什么是拦截器?什么是过滤器?
深度解析拦截器与过滤器:区别、原理与实战应用 在 Java Web 开发中,过滤器(Filter) 和 拦截器(Interceptor) 是两种常用的请求处理组件。本文将系统梳理两者的区别、底层依赖框架、自定义实现方式…...
如何高效生成技术文章:方法与工具详解
如何高效生成技术文章:方法与工具详解 在当前科技发展迅速的时代,技术文章已成为工程师、开发者及技术爱好者共享知识、交流经验的重要载体。本文将为您详细介绍高效生成技术文章的具体方法与常用工具,助您提升写作效率与质量。 1. 明确写作主…...
cocotb实战入门:从零搭建D触发器测试环境
1. 为什么选择cocotb验证D触发器? 数字电路验证是芯片设计流程中不可或缺的环节。传统验证方法往往需要搭建复杂的SystemVerilog或UVM环境,这对初学者来说门槛较高。而cocotb这个Python验证框架,就像给硬件工程师配了一把瑞士军刀——用熟悉的…...
BM2102-9x-1 Sub-1G OOK无线发射模块驱动与工程实践
1. 项目概述BM2102-9x-1 是由 Best Modules 推出的一款工作于 Sub-1G 频段(典型频点为 315MHz、433.92MHz、868MHz 和 915MHz)的 OOK(On-Off Keying)无线发射模块,采用透明传输(Transparent Transmission&a…...
如何永久保存微信聊天记忆:WeChatMsg数据导出与智能分析全攻略
如何永久保存微信聊天记忆:WeChatMsg数据导出与智能分析全攻略 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...
如何在Linux桌面环境下实现高效屏幕翻译:CuteTranslation完整解决方案深度解析
如何在Linux桌面环境下实现高效屏幕翻译:CuteTranslation完整解决方案深度解析 【免费下载链接】CuteTranslation Linux屏幕取词翻译软件 项目地址: https://gitcode.com/gh_mirrors/cu/CuteTranslation 对于Linux用户来说,面对外文技术文档、学术…...
