Python3中数据校验机制详解

 更新时间:2024年04月24日 11:47:59   作者:rs勿忘初心  
在日常编码环节,很大比例的错误处理工作和参数的输入有关,所以这篇文章主要来和大家介绍一下Python3中的数据校验机制,感兴趣的可以了解下

在日常编码环节,很大比例的错误处理工作和参数的输入有关。当程序里的某些数据直接来自用户输入时,必须先校验这些输入值,再进行之后的处理,否则就会出现难以预料的错误。

需求

写一个命令行小程序,它要求用户输入一个 0~100 范围的数字。假如用户输入的内容无效,就要求其重新输入。

常规方案

示例代码如下:

def input_a_number():
    """要求用户输入一个 0~100 的数字,如果无效则重新输入"""
    while True:
        number = input('Please input a number (0-100): ')
        
        if not number:
            print('Input can not be empty!')
            continue
        if not number.isdigit():
            print('Your input is not a valid number!')
            continue
        if not (0 <= int(number) <= 100):
            print('Please input a number between 0 and 100!')
            continue
 
        number = int(number)
        break
 
    print(f'Your number is {number}')

测试结果:

Please input a number (0-100):
Input can not be empty!
Please input a number (0-100): hello
Your input is not a valid number!
Please input a number (0-100): 80
Your number is 80

这个虽然可以满足我们的需求,但是如果需要校验的输入有很多,那这个检验逻辑就会很复杂冗余。

使用pydantic专业数据校验模块

来看下介绍:

Pydantic 是一个 Python 的数据验证库,它可以让你定义数据模型并自动验证输入数据的类型和结构。它的主要目标是使数据验证变得简单、快速和可靠。

以下是 Pydantic 的一些主要功能和优点:

  • 声明式模型定义:使用 Pydantic,你可以通过简单的 Python 类来定义数据模型。这些类使用类型提示来定义字段的类型,并且支持各种 Python 原生类型、自定义类以及第三方库的类型。
  • 自动验证:定义好数据模型后,Pydantic 将自动验证输入数据的类型和结构是否符合模型的要求。如果数据不符合模型定义,Pydantic 将会引发验证错误。
  • 数据解析:Pydantic 提供了方便的方法来解析原始数据(如 JSON、字典等)并将其转换为定义的数据模型实例。
  • 序列化输出:除了解析输入数据,Pydantic 还可以将数据模型实例序列化为 JSON 字符串或字典等格式,以便于输出或传输。
  • 数据转换:Pydantic 允许你定义字段的转换函数,以在数据验证或解析过程中对字段进行转换或预处理。
  • 内置验证器:Pydantic 提供了许多内置的验证器,如 EmailValidator、LengthValidator 等,用于验证字段的特定属性。
  • 与 FastAPI 集成:Pydantic 与 FastAPI 框架深度集成,可以直接将 Pydantic 模型用作 FastAPI 路径操作的请求和响应模型。

总的来说,Pydantic 是一个功能强大且易于使用的数据验证库,特别适用于构建需要处理大量数据输入和输出的 Python 应用程序,如 Web 服务、API 和数据处理工具。

上面的需求,重新实现一次: 

from pydantic import BaseModel, conint, ValidationError
class NumberInput(BaseModel):
    # 使用类型注解 conint 定义 number 属性的取值范围
    number: conint(ge=0, le=100)
 
 
def input_a_number_with_pydantic():
    while True:
        number = input('Please input a number (0-100): ')
 
        # 实例化为 pydantic 模型,捕获校验错误异常
        try:
            number_input = NumberInput(number=number)
        except ValidationError as e:
            print(e)
            continue
 
        number = number_input.number
        break
 
    print(f'Your number is {number}')

其它场景

在编写代码时,应当尽量避免手动校验任何数据(一般搜下都会有专门的模块)。因为数据校验任务独立性很强,所以应该引入合适的第三方校验模块(或者自己实现),让它们来处理这部分专业工作。

比如你在开发 Web 应用,数据校验工作通常来说比较容易。比如 Django 框架就有自己的表单验证模块,Flask 也可以使用 WTForms 模块来进行数据校验。

WTForms模块介绍:

WTForms 是一个 Python 的 Web 表单验证和渲染库,用于处理 Web 应用程序中的表单。它提供了一个简单而灵活的方式来定义表单,验证用户输入并生成 HTML 表单字段。

一个简单而灵活的方式来定义表单,验证用户输入并生成 HTML 表单字段。

以下是 WTForms 的一些主要特点和优点:

  • 简单易用:WTForms 提供了一个简洁的 API,使得定义和处理表单变得简单和直观。
  • 表单验证:WTForms 允许你定义表单字段以及它们的验证规则,例如必填、长度限制、数据类型等。当用户提交表单时,WTForms 会自动验证用户输入是否符合定义的规则,并返回相应的错误消息。
  • CSRF 保护:WTForms 内置了 CSRF(Cross-Site Request Forgery)保护,可以帮助你防止 CSRF 攻击。
  • 支持多种字段类型:WTForms 支持多种常见的 HTML 表单字段类型,如文本框、密码框、复选框、下拉框等,同时也支持自定义字段类型。
  • 表单渲染:WTForms 可以根据表单定义自动生成 HTML 表单字段,简化了前端开发的工作。
  • 与 Flask 和 Django 集成:WTForms 可以与 Flask 和 Django 等流行的 Web 框架无缝集成,方便在这些框架中使用。

下面是一个简单的示例,演示如何使用 WTForms 在 Flask 中创建一个简单的登录表单:

from flask import Flask, render_template, request
from wtforms import Form, StringField, PasswordField, validators
 
# 创建 Flask 应用程序
app = Flask(__name__)
 
# 定义登录表单
class LoginForm(Form):
    username = StringField('Username', [validators.Length(min=4, max=25)])
    password = PasswordField('Password', [validators.DataRequired()])
 
# 定义登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    # 创建登录表单实例
    form = LoginForm(request.form)
    # 检查表单是否已提交且通过验证
    if request.method == 'POST' and form.validate():
        # 获取表单中的用户名和密码
        username = form.username.data
        password = form.password.data
        # 在这里可以进行用户认证等操作
        return f'Welcome, {username}!'
    # 渲染登录页面并传入表单实例
    return render_template('login.html', form=form)
 
if __name__ == '__main__':
    app.run(debug=True)

在上面的示例中,我们首先定义了一个名为 LoginForm 的表单类,其中包含了用户名和密码两个字段,并指定了它们的验证规则。然后,我们在登录路由中使用该表单类创建了表单实例,并在提交表单时进行了验证。如果表单验证通过,就可以获取用户名和密码并进行相应的处理。

当然,你需要在 Flask 应用程序的模板中创建一个 HTML 文件来渲染登录表单,但这超出了代码示例的范围。

到此这篇关于Python3中数据校验机制详解的文章就介绍到这了,更多相关Python3数据校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python获取指定时间段内特定规律的日期列表

    python获取指定时间段内特定规律的日期列表

    这篇文章主要介绍了python获取指定时间段内特定规律的日期列表,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • python爬取”顶点小说网“《纯阳剑尊》的示例代码

    python爬取”顶点小说网“《纯阳剑尊》的示例代码

    这篇文章主要介绍了python爬取”顶点小说网“《纯阳剑尊》的示例代码,帮助大家更好的利用python 爬虫爬取数据,感兴趣的朋友可以了解下
    2020-10-10
  • tensorflow2.0保存和恢复模型3种方法

    tensorflow2.0保存和恢复模型3种方法

    今天小编就为大家分享一篇tensorflow2.0保存和恢复模型3种方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python timestamp和datetime之间转换详解

    python timestamp和datetime之间转换详解

    这篇文章主要为大家详细介绍了python timestamp和datetime之间转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 还不知道Anaconda是什么?读这一篇文章就够了

    还不知道Anaconda是什么?读这一篇文章就够了

    Anaconda指的是一个开源的Python发行版本,其包含了Conda、Python等180多个科学包及其依赖项,下面这篇文章主要给大家介绍了关于Anaconda是什么的相关资料,需要的朋友可以参考下
    2023-02-02
  • 如何在Python中进行异常处理

    如何在Python中进行异常处理

    这篇文章主要介绍了如何在Python中进行异常处理,Python中使用用异常对象(exception object)表示异常情况,当程序运行遇到错误后,就会触发发异常,下文关于异常处理的相关内容,需要的小伙伴可以参考一下
    2022-03-03
  • python+pytest接口自动化之session会话保持的实现

    python+pytest接口自动化之session会话保持的实现

    在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,本文主要介绍了python+pytest接口自动化之session会话保持的实现,感兴趣的可以了解一下
    2022-06-06
  • python代码实现备忘录案例讲解

    python代码实现备忘录案例讲解

    这篇文章主要介绍了python代码实现备忘录案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • python实现对AES加密的视频数据流解密的方法

    python实现对AES加密的视频数据流解密的方法

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,这篇文章主要介绍了用python实现对AES加密的视频数据流解密,需要的朋友可以参考下
    2023-02-02
  • Python 使用 PyMysql、DBUtils 创建连接池提升性能

    Python 使用 PyMysql、DBUtils 创建连接池提升性能

    DBUtils 是一套 Python 数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。这篇文章主要介绍了Python 使用 PyMysql、DBUtils 创建连接池,提升性能,需要的朋友可以参考下
    2019-08-08

最新评论