python
主页 > 脚本 > python >

Python3中数据校验机制介绍

2024-04-24 | 佚名 | 点击:

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

需求

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

常规方案

示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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 应用程序,如 Web 服务、API 和数据处理工具。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 在 Flask 中创建一个简单的登录表单:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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 文件来渲染登录表单,但这超出了代码示例的范围。

原文链接:
相关文章
最新更新