zoukankan      html  css  js  c++  java
  • WTForm表单验证

    flask-WTF是对WTForms的再封装,使其更好更方便地适用于flask框架。WTForms表单的两个主要功能是验证用户提交数据的合法性和渲染模板,至于渲染模板这个功能由于前后端分离的开发模式而变得有些鸡肋。

    安装:pip3 install flask-WTF

    安装flask-WTF的时候也会自动把WTForms也安装了。

    对于表单验证,如注册表单,要输入用户名,密码,重复密码,而且有很多规则限制,如长度,必须字母开头且包含数字字母下划线中的两种或以上等等,这时候就得在后端做很多逻辑判断,比较烦杂。WTForms可以帮我们来处理验证问题。

    以下是登录注册过程的表单验证处理:

    app.py:

     1 from flask import Flask,request,render_template
     2 from forms_verify import RegisterForm,LoginForm
     3 app = Flask(__name__)
     4 
     5 @app.route('/')
     6 def hello_world():
     7     return "hello world"
     8 
     9 @app.route('/register',methods=['GET','POST'])
    10 def register():
    11     if request.method == "GET":
    12         return render_template('register.html')
    13     else:
    14         form = RegisterForm(request.form)
    15         if form.validate():
    16             return "注册成功!!"
    17         else:
    18             return return_err_message('register.html',form)
    19 
    20 
    21 @app.route('/login',methods=['GET','POST'])
    22 def login():
    23     if request.method == "GET":
    24         return render_template('login.html')
    25     else:
    26         form = LoginForm(request.form)
    27         if form.validate():
    28             return "登录成功!!"
    29         else:
    30             return return_err_message('login.html',form)
    31 
    32 
    33 def return_err_message(template,form):
    34     ''' 将返回错误提示信息功能抽离出来单独作为一个函数'''
    35     print(form.errors)
    36     err_message = list(form.errors.values())[0][0] # 错误信息的字符串提取
    37     print(err_message)
    38     content = {
    39         'err_message': err_message
    40     }
    41     return render_template(template, **content)
    42 
    43 
    44 if __name__ == '__main__':
    45     app.run()

    forms_verify.py :表单验证

     1 from wtforms import Form,StringField,IntegerField,FileField
     2 from wtforms.validators import ValidationError,Length,EqualTo,Email,InputRequired,Regexp,NumberRange,URL,UUID
     3 from flask_wtf.file import FileRequired,FileAllowed
     4 
     5 """ 表单验证 """
     6 
     7 class RegisterForm(Form):  # 继承自Form
     8     """注册表单验证"""
     9     email = StringField(validators=[Email(message="邮箱格式不正确")])# message:错误提示信息
    10     # validators:验证器,可多个,列表形式表示
    11     username = StringField(validators=[InputRequired(message="您未输入")])
    12     pwd = StringField(validators=[Length(min=6, max=12, message="密码长度必须为6至12位")])
    13     pwd_rep = StringField(validators=[EqualTo('pwd',message="两次密码输入必须一致")])
    14     age = IntegerField(validators=[NumberRange(12, 120,message="年龄超出范围")])
    15     phone = StringField(validators=[Regexp(r'1(3[0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|8[0-9]|9[89])d{8}',message="手机号格式不正确"),
    16                                     Length(min=11, max=11, message="手机号格式不正确")])
    17     homepage = StringField(validators=[URL(message="url格式不正确")])
    18     uuid = StringField(validators=[UUID(message="uuid格式不正确")])
    19 
    20 class LoginForm(Form):
    21     """ 登录表单验证 """
    22     username = StringField(validators=[Length(min=6, max=12, message="用户名长度必须为6至12位")])
    23     pwd = StringField(validators=[Length(min=6, max=12, message="密码长度必须为6至12位")])
    24 
    25     captcha = StringField(validators=[Length(4,4,message="验证码错误")])
    26     def validate_captcha(self,filed):
    27         """这里方法名必须validate_字段名,假设验证码为9850"""
    28         if filed.data != "9850":
    29             raise ValidationError("验证码错误")

    常用的验证器:

    1. Email:验证上传的数据是否为邮箱。
    2. EqualTo:验证上传的数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。
    3. InputRequir:验证输入是否为空。
    3. Length:长度限制,有min和max两个值进行限制。
    4. NumberRange:数字的区间,有min和max两个值限制,如果处在这两个数字之间则满足。
    5. Regexp:自定义正则表达式。
    6. URL:必须要是URL的形式。
    7. UUID:验证UUID。

    login.html:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>login</title>
     6 </head>
     7 <body>
     8 <form action="" method="post">
     9     <table>
    10         <tr>
    11             <td>用户名:</td>
    12             <td><input type="text" name="username"></td>
    13         </tr>
    14         <tr>
    15             <td>密码:</td>
    16             <td><input type="password" name="pwd"></td>
    17         </tr>
    18         <tr>
    19             <td>验证码:</td>
    20             <td><input type="text" name="captcha"></td>
    21         </tr>
    22         <tr>
    23             <td></td>
    24             <td><input type="submit" value="立即登录"></td>
    25         </tr>
    26     </table>
    27     {% if err_message %}
    28         <p style="color: red">{{ err_message }}</p>
    29     {% endif %}
    30 </form>
    31 </body>
    32 </html>

    register.html:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>register</title>
     6 </head>
     7 <body>
     8 <form action="" method="post">
     9     <table>
    10         <tr>
    11             <td>邮箱:</td>
    12             <td><input type="text" name="email"></td>
    13         </tr>
    14         <tr>
    15             <td>用户名:</td>
    16             <td><input type="text" name="username"></td>
    17         </tr>
    18         <tr>
    19             <td>密码:</td>
    20             <td><input type="password" name="pwd"></td>
    21         </tr>
    22         <tr>
    23             <td>重复密码:</td>
    24             <td><input type="password" name="pwd_rep"></td>
    25         </tr>
    26         <tr>
    27             <td>年龄:</td>
    28             <td><input type="text" name="age"></td>
    29         </tr>
    30         <tr>
    31             <td>手机号:</td>
    32             <td><input type="text" name="phone"></td>
    33         </tr>
    34         <tr>
    35             <td>主页:</td>
    36             <td><input type="text" name="homepage"></td>
    37         </tr>
    38         <tr>
    39             <td>UUID:</td>
    40             <td><input type="text" name="uuid"></td>
    41         </tr>
    42         <tr>
    43             <td></td>
    44             <td><input type="submit" value="立即注册"></td>
    45         </tr>
    46     </table>
    47     {% if err_message %}
    48         <p style="color: red">{{ err_message }}</p>
    49     {% endif %}
    50 </form>
    51 </body>
    52 </html>

     实际页面:

    自定义验证器:

    如果想要对表单中的某个字段进行更细化的验证,那么可以针对这个字段进行单独的验证。如验证码,步骤如下:
    1. 定义一个方法,方法的名字规则是:'validate_字段名(self,filed)'。
    2. 在方法中,使用'field.data'可以获取到这个字段的具体的值。
    3. 如果数据满足条件,那么可以什么都不做。如果验证失败,那么应该抛出一个'wtforms.validators.ValidationError'的异常,并且把验证失败的信息传到这个异常类中。

  • 相关阅读:
    [微信篇]ESP8266-NonOS学习笔记(十一)之微信小程序控制LED灯 Part 1
    [外设篇]ESP8266-SDK教程(十)之DHT11、OLED1306
    [基础篇]ESP32-RTOS-SDK教程(一)之Windows环境搭建
    [网络篇]ESP8266-SDK教程(九)之物联网标配MQTT实际测试
    [网络篇]ESP8266-SDK教程(八)之物联网标配MQTT服务端软件
    [网络篇]ESP8266-SDK教程(七)之物联网标配MQTT初相识
    [网络篇]ESP8266-SDK教程(六)之网页配置Wi-Fi名称和密码
    [网络篇]ESP8266-SDK教程(五)之SmartConfig、Airkiss等多种配网方式
    [基础篇]ESP8266-SDK教程(四)之GPIO操作(按键、LED、中断、定时器)
    [网络篇]ESP8266-SDK教程(三)之TCP通信Server<->Client
  • 原文地址:https://www.cnblogs.com/wangyi0419/p/12710263.html
Copyright © 2011-2022 走看看