使用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 返回值

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

从零开始学数据库 day2 DML

从零开始学数据库&#xff1a;DML操作详解 在今天的数字化时代&#xff0c;数据库的使用已经成为了各行各业的必备技能。无论你是想开发一个简单的应用&#xff0c;还是想要管理复杂的数据&#xff0c;掌握数据库的基本操作都是至关重要的。在这篇博客中&#xff0c;我们将专注…

Java 8 Stream API

文章目录 Java 8 Stream API1. Stream2. Stream 的创建3. 常见的 Stream 操作3.1 中间操作3.2 终止操作 4. Stream 的并行操作 Java 8 Stream API Java 8 引入了 Stream API&#xff0c;使得对集合类&#xff08;如 List、Set 等&#xff09;的操作变得更加简洁和直观。Stream…

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服 根据上一步的步骤&#xff0c;已经调试了ONE API的接口&#xff0c;下面&#xff0c;我们就登陆fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 这个就是你的fastGPT后台地址&#xff0c;可以在configer文件中找到。 账号是…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

【王树森搜索引擎技术】相关性02:评价指标(AUC、正逆序比、DCG)

相关性的评价指标 Pointwise评价指标&#xff1a;Area Under the Curve&#xff08;AUC&#xff09;Pairwise评价指标&#xff1a;正逆序比&#xff08;Positive to Negative Ratio, PNR&#xff09;Listwise评价指标&#xff1a;Discounted Cumulative Gain(DCG)用AUC和PNR作…

人物一致性训练测评数据集

1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…

Android 项目依赖冲突问题:Duplicate class found in modules

问题描述与处理处理 1、问题描述 plugins {id com.android.application }android {compileSdk 34defaultConfig {applicationId "com.my.dialog"minSdk 21targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.run…

计算机网络 | 什么是公网、私网、NAT?

关注&#xff1a;CodingTechWork 引言 计算机网络是现代信息社会的基石&#xff0c;而网络通信的顺畅性和安全性依赖于有效的IP地址管理和网络转换机制。在网络中&#xff0c;IP地址起到了标识设备和进行数据传输的核心作用。本文将详细讨论公网IP、私网IP以及NAT转换等网络技…

python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用户密码MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化数据库(后续的初始化sql会在这个库执行)MYSQL_DATABASE: nac…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

基于 WEB 开发的汽车养护系统设计与实现

标题:基于 WEB 开发的汽车养护系统设计与实现 内容:1.摘要 本文介绍了基于 WEB 开发的汽车养护系统的设计与实现。文章首先阐述了系统的背景和目的&#xff0c;即随着汽车保有量的增加&#xff0c;汽车养护需求日益增长&#xff0c;传统的汽车养护方式已经无法满足人们的需求&…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

【爬虫】某某查cookie逆向

代码仅供技术人员进行学习和研究使用&#xff0c;请勿将其用于非法用途或以任何方式窃取第三方数据。使用该代码产生的所有风险均由用户自行承担&#xff0c;作者不对用户因使用该代码而造成的任何损失或损害承担任何责任。 加密参数 加密参数主要是cookie&#xff0c;其中只有…

A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置

下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…

如何设置HTTPS站点防御?

设置HTTPS站点防御涉及到多个层面的安全措施&#xff0c;包括但不限于配置Web服务器、应用安全头信息、使用内容安全策略&#xff08;CSP&#xff09;、启用HSTS和OCSP Stapling等。下面是一些关键的步骤来增强HTTPS网站的安全性&#xff1a; 1. 使用强加密协议和密钥交换算法…

[Java]类和对象

1. 什么是类&#xff1f; 类&#xff08;Class&#xff09;是蓝图或者模板。它定义了对象的属性和行为。 类就是一种抽象的模板&#xff0c;你可以通过它创建多个对象。类定义了对象的属性&#xff08;变量&#xff09;和行为&#xff08;方法&#xff09;。我们可以把类理解…

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中&#xff0c;我们将讨论如何预测股票的收益。这是一个非常复杂的任务&#xff0c;充满了不确定性。我们将会把这个项目分成两部分进行开发&#xff1a; 首先&#xff0c;我们将学习如何使用 LSTM 神经网络预测股票…