使用Flask和Pydantic实现参数验证

Flask项目安全防护实战:从SQL注入到CSRF的全面防御指南 在Web开发领域,安全防护是构建可靠应用的核心基础。其原理在于通过分层防御体系,在数据输入、业务处理、输出响应等各环节实施安全控制,从而保障应用免受恶意攻击。从技术价值看,有效的安全措施能防止数据泄露、服务中断和财产损失,是项目成功上线的关键保障。无论是电商平台、内容管理系统还是API服务,安全都是不可或缺的要素。本文聚焦Flask框架,针对SQL注入、CSRF等常见漏洞,提供从输入验证到生产环境配置的完整解决方案,帮助开发者构建坚固的Web应用防线。 阅读详情
AI摘要

该博客介绍了使用Flask和Pydantic实现参数验证的方法。Pydantic是用于数据验证和解析的Python库,版本2性能提升,很多框架用其做数据校验。还阐述了使用Flask自定义参数校验的结构、给出相关源代码文件,并提及返回值。

使用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 json

from flask import jsonify


def 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 ValidationError

from entity.app.app_result import result



def validate_form(form_object):
    # 设置含有请求参数的装饰器
    def inner(fun):
        def inner_sub():
            try:
                # 获取Content-Type
                content_type = request.content_type
                
                # if content_type is None:
                #     return result(code=400, msg="No parameters")

                # 验证参数
                form_instance = None
                if content_type is None:
                    # 获取 Get请求中地址栏的参数
                    parameters = request.args.to_dict()
                    # 将字典转化为对象
                    form_instance = form_object(**parameters)

                # 获取 “application/json” 请求
                elif "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)

                return fun(form_instance)

            except ValidationError as e:
                # 存储错误参数列表
                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_sub
    return inner

data_form.py

from typing import Optional

from pydantic import BaseModel, Field, field_validator


class 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, Blueprint

from test.data_form import DataForm
from entity.form.validate_request import validate_form

app = 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与FastAPI接口定义对比及选型指南 Python Web开发中,路由定义和请求处理是框架的核心机制。传统微框架如Flask采用装饰器语法和全局request对象处理请求,而现代框架如FastAPI通过类型提示和Pydantic模型实现自动数据验证。从技术原理看,FastAPI基于Starlette实现原生异步支持,配合OpenAPI标准自动生成交互式文档,显著提升开发效率。在工程实践中,FastAPI的强类型系统可减少30%以上的数据校验代码,特别适合需要长期维护的RESTful API项目。对于高并发IO场景,其异步处理能力相比Flask有 阅读详情

相关推荐

Flask 学习-39.Flask-RESTful 请求参数校验inputs

在校验请求参数的时候,type 参数类型可以设置为正则匹配,邮箱匹配,url匹配等在inputs模块有补充。

qq_27371025的博客 1054

Flask+pydantic进行参数校验和包装

参考 FastApi 中参数的处理,编写了一个简单的使用 pydantic 对 Flask 中的参数进行校验并且包装为 pydantic 中的 BaseModel 的工具函数,将参数映射到 BaseModel 中,简化参数校验以及对参数的包装

qq_62485652的博客 1154

FastAPI入门:高性能Web框架

在 Python Web 开发领域,Flask 和 Django 长期以来占据着主导地位。然而,随着微服务架构的兴起和前端对 API 响应速度要求的不断提高,开发者对 Web 框架的性能、开发效率和类型安全提出了更高的要求。FastAPI 正是在这样的背景下应运而生,并迅速成为 Python 生态中增长最快的 Web 框架[reference:0][reference:1]。 FastAPI 是一个现代、高性能的 Python Web 框架,专为构建 API 而生[reference:2]。它基于 Sta

2601_96023685的博客 202

flask_pydantic @validate 修改返回结果

3. 如果 `FLASK_PYDANTIC_VALIDATION_ERROR_RAISE` 设置为 False,那么程序会读取 `FLASK_PYDANTIC_VALIDATION_ERROR_STATUS_CODE` 配置选项来确定返回的 HTTP 状态码,默认为 400。然后他一共有四种校验参数:body_params,form_params,path_params,query_params,如果有值就返回,如果没有就不返回。1. 如果 `err` 存在,说明出现了 Pydantic 校验错误。

qq_45961148的博客 1036

flask_pydantic:用于扩展真棒pydantic软件包的flask扩展

烧瓶-釜山 Flask扩展,用于将强大的与集成。 安装 python3 -m pip install Flask-Pydantic 基本 validate装饰器验证查询和主体请求参数并使它们可通过两种方式访问​​: 参数类型 request属性名称 询问 query_params 身体 body_params 可以通过validate装饰器的on_success_status参数修改成功响应状态代码。 response_many参数设置为True可启用多个模型的序列化(因此路由功能应返回模型的可迭代性)。 设置为False request_body_many参数可以在请求正文的根级别

Python库 | Flask_Pydantic-0.7.1-py3-none-any.whl

python库,解压后可用。 资源全名:Flask_Pydantic-0.7.1-py3-none-any.whl

flask-SQLAlchemy-pydantic实现数据校验的增删改查操作

from flask import Flask, jsonify from flask_sqlalchemy import SQLAlchemy from demo import Role, to_json app = Flask(__name__) app.debug = True # 通过 app 配置数据库信息 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:149789@127.0.0.1:3306/sqlalche.

weixin_42289273的博客 2525

自动化革命:AI在需求分析、代码生成与测试中的深度应用

在2025年的科技浪潮中,人工智能(AI)已不再是实验室中的概念,而是深度渗透至软件开发的全生命周期。从需求分析的精准捕捉,到代码生成的自动化创作,再到测试环节的智能覆盖,AI正以革命性姿态重塑软件工程的核心环节。本文将结合2025年最新数据与行业实践,解析AI如何在这三大领域实现深度应用。

1511

flask Pydantic 请求校验神器!一行代码拒绝非法输入

摘要:本文介绍如何使用Flask框架结合Pydantic库实现高效的请求参数校验。通过定义Pydantic数据模型自动完成类型转换和校验,创建可复用的校验装饰器简化路由处理,支持复杂嵌套结构和查询参数校验。文章还包含自定义错误消息、性能优化建议(模型预编译)以及测试验证方法,帮助开发者构建健壮的API接口校验机制,显著减少重复校验代码。

zlzdj的专栏 72

ENU坐标系实战:5分钟搞定无人机导航中的站心坐标转换

本文针对无人机导航中GPS坐标与视觉感知不匹配的定位漂移问题,提供了基于ENU坐标系的实战解决方案。通过Python代码演示了如何快速、精准地实现地心地固坐标与站心坐标之间的转换,并详细解释了转换原理、精度对比及工程优化技巧,帮助开发者从根本上解决局部相对定位不准的难题。

mqtt6iot的博客 552

【低空经济】低空无人驾驶航空器运行管理系统设计方案

低空无人驾驶航空器运行管理系统(以下简称“系统”)旨在为低空域内的无人驾驶航空器(UAV)提供高效、安全、智能的运行管理服务。系统通过集成先进的通信、导航、监控、数据处理和人工智能技术,实现对低空域内无人驾驶航空器的实时监控、动态调度、风险评估和应急响应,确保其在复杂空域环境中的安全运行。系统的核心功能包括空域管理、飞行计划审批、实时监控、冲突预警、应急管理和数据分析。空域管理模块负责划分和管理低空域资源,确保不同飞行任务之间的空域隔离和高效利用。

2502_92579126的博客 1140

Dify API 控制器层开发指南:Flask-RESTX + Pydantic 的 Schema 模式、Swagger 契约与 System-Features 边界

本文以 Dify 仓库中的 [API Schema 开发指南](https://link.gitcode.com/i/2a291617268b780709badc6e1e167ac7) 为主体,完整讲解 Dify 后端控制器(controllers)层采用的 Flask-RESTX + Pydantic 请求体、查询参数、响应模型与 Swagger 文档的统一模式,并结合 [controllers

gitblog_00959的博客 464

GEPA_AIME教程:使用GEPA优化数学问题求解的完整指南

本教程展示了如何使用DSPy框架中的GEPA(Generative Evolutionary Prompt Adaptation)优化器来提升大语言模型在数学竞赛问题(AIME)上的表现。# 创建基础的链式思考程序"""带有详细反馈的评估指标,为GEPA提供学习信号"""try:# 处理解析错误feedback_text = f"最终答案必须是一个有效的整数。你回答了'

步子哥的博客 1386

fastapi jinja2_(入门篇)简析一个比Flask和Tornado更高性能的API 框架FastAPI

用官方的话来说,FastAPI 是一种现代,快速(高性能)的 Web 框架,基于标准Python 类型提示使用 Python 3.6+ 构建 APIFastAPI 站在巨人的肩膀上?很大程度上来说,这个巨人就是指 Flask 框架。FastAPI 从语法上和 Flask 非常的相似,有异曲同工之妙。技术背景:Py3.6+,Starlette,Pydantic其实不仅仅是 FastAPI ,就连 S...

weixin_39683526的博客 579

【实战圣经】YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

m0_71589036的博客 251

柔性电极材料新突破:清华团队实现0.1mV级脑信号采集精度

清华团队的 0.1mV 级柔性电极突破,不仅是材料科学与神经工程的跨界胜利,更标志着脑机接口从 “信号采集” 向 “神经交互” 的范式转变。当电极与脑组织实现 “柔性共生”,人类首次拥有了窥探大脑微观电活动的 “精密探头”,这既是神经疾病诊疗的里程碑,更是人机融合时代的新起点。随着技术标准化与产业生态的完善,这场始于实验室的 “柔性革命”,正加速向临床病房、智能工厂、消费电子等场景渗透,为脑机接口的大规模应用铺设 “柔性跑道”。:当柔性电极实现 “神经信号的无损捕捉”,如何平衡技术创新与伦理边界?

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2944

FastAPI与Flask全面对比:从核心特性到实战选型指南

在Python Web开发领域,框架选型直接影响项目的开发效率和可维护性。Web框架的核心原理在于处理HTTP请求、路由分发和响应生成,其技术价值体现在提升开发效率、保障代码质量和优化应用性能。现代Web应用,尤其是API服务和数据接口,对高性能、清晰文档和异步支持的需求日益增长。FastAPI凭借其基于Python类型提示的声明式开发、自动API文档生成和原生异步支持,在高性能API和微服务场景中表现出色。Flask则以极简的微内核设计、平缓的学习曲线和庞大的扩展生态,在快速原型开发和小型Web应用中备受

weixin_29215391的博客 321

44、单级静态电流消耗最小化方法及功率优化比较器设计

本文探讨了单级静态电流消耗最小化方法及功率优化的多米诺逻辑比较器设计。通过分析类“AB”输入CMOS差分对电路,提出利用补偿电流源实现高低电流模式切换,提升运算放大器性能;结合VTCMOS与时钟门控技术,在90nm CMOS中设计低功耗比较器,并采用多米诺逻辑提高速度与能效。通过对比传统与改进型多米诺逻辑的静态功耗、动态功耗、延迟和PDP,验证了所提方案在高性能与低功耗方面的优势,适用于便携式设备等对能效要求严苛的应用场景。

pp12345的博客 121

Flask与Pydantic实现高效请求参数校验实战

在Web开发中,请求参数校验是保障接口安全与数据完整性的关键技术。通过类型系统与数据验证的结合,可以构建健壮的API防护层。Pydantic作为Python生态中的校验利器,利用声明式模型定义和自动类型转换机制,显著提升开发效率。该库原生支持正则校验、嵌套模型等复杂场景,与Flask装饰器结合后,能实现优雅的请求验证流程。在实际工程中,这种方案可减少60%以上的校验代码量,同时完美支持JSON/form-data等多种数据格式。特别在高并发场景下,通过模型预编译等优化手段,校验延迟可控制在1-3ms内,是微

weixin_33824385的博客 278

C#里使用NModbus来创建一个TCP从站服务

摘要:本文介绍了一个用C#实现的Modbus TCP从站服务器,基于.NET Framework 4.6.1开发。代码使用NModbus库创建TcpListener和ModbusSlaveNetwork,支持设置IP地址、端口号和从站ID。服务器实现了数据存储初始化功能(包括线圈和保持寄存器),并提供了启动/停止操作的UI界面和日志记录功能。该解决方案适用于需要调试Modbus TCP协议的场景,特别适合无法升级到更高版本.NET Framework的环境。

大坡3D软件开发 478

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

fastapi jinja2_(入门篇)Python框架之FastAPI——一个比Flask和Tornado更高性能的API 框架

用官方的话来说,FastAPI 是一种现代,快速(高性能)的 Web 框架,基于标准Python 类型提示使用 Python 3.6+ 构建 APIFastAPI 站在巨人的肩膀上?很大程度上来说,这个巨人就是指 Flask 框架。FastAPI 从语法上和 Flask 非常的相似,有异曲同工之妙。技术背景:Py3.6+,Starlette,Pydantic其实不仅仅是 FastAPI ,就连 S...

weixin_39675178的博客 324

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

2021.10.1-10.2FastAPI框架

FastAPI - 优于flask的py web框架 优快云-参考 FastAPI 可以用 url/docs 查看自动生成的API模型 学习内容见pycharm或我的Gitee FastAPI与flask不同处: 装饰器 @app.route(’’, methods=[‘POST’]) @app.get(’’) @app.post(") @app.put(") @app.delete(") 路径参数 @app.route(’/page/int:num’) @app.get("

m0_55355215的博客 447

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Flask vs FastAPI:Python Web框架核心差异与项目选型实战指南

在Python Web开发领域,选择合适的框架是构建高效应用的关键。Web框架的核心在于处理HTTP请求、路由分发和业务逻辑组织,其设计哲学直接影响开发效率和系统性能。从原理上看,同步框架基于WSGI标准,每个请求占用独立线程;而异步框架基于ASGI标准,利用事件循环处理高并发I/O操作,能更高效地利用系统资源。这一技术差异带来了显著的价值:异步架构能大幅提升API服务的吞吐量和响应速度,尤其适合微服务和数据密集型场景。在实际应用中,开发者需要根据项目类型、团队技能和性能要求进行选型。例如,构建RESTfu

weixin_29234239的博客 237

30 分钟上手 FastAPI:比 Flask 快、比 Django 轻

FastAPI 是一款高性能 Python Web 框架,兼具轻量级与高效特性,适合快速构建 API。相比 Flask 和 Django,FastAPI 原生支持异步、自动生成 API 文档(Swagger/ReDoc),并利用 Pydantic 实现数据自动校验。

I1951245924的博客 370

从Flask迁移到FastAPI:如何避免422错误并掌握声明式API开发

在Web API开发中,数据验证和序列化是确保接口健壮性的核心环节。传统框架通常需要开发者手动编写大量校验代码,这不仅繁琐且容易出错。FastAPI通过引入Pydantic数据模型和类型注解,实现了声明式的数据契约定义,将验证、文档生成和序列化自动化。这种范式转换显著提升了开发效率和代码可维护性,其技术价值在于构建强类型、自文档化的API,减少运行时错误。在实际应用场景中,尤其是在微服务架构或需要严格API契约的项目里,FastAPI的自动验证能有效拦截非法数据,例如处理JSON请求时自动返回详细的422

weixin_28710999的博客 306

Flask与FastAPI接口定义对比:Python Web开发框架选择指南

Web开发框架是构建现代应用的核心工具,Python生态中的Flask和FastAPI分别代表了不同时代的解决方案。Flask作为经典的WSGI微框架,以其灵活性和扩展性著称,适合需要高度定制化的项目。FastAPI基于ASGI协议,原生支持异步编程和类型提示,特别适合构建高性能API。从技术原理看,Flask采用装饰器路由和请求上下文,而FastAPI深度整合Pydantic实现数据验证。在工程实践中,FastAPI的自动文档生成和依赖注入系统显著提升开发效率,而Flask的Blueprint机制在传统W

weixin_30899023的博客 207
上一篇: Docker私有仓库管理工具Registry
下一篇: Docker安装pypiserver私服
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值