Flask 第十一话之表单验证插件 -- Flask-WTF和wtforms

一、安装

pip install flask-wtf
pip install wtforms

 二、wtforms基本使用

一、常用内置验证器:

1.Email:验证上传数据是否是邮箱
2.EqualTo:验证上传数据是否和另一个相等
3.InputRequired:原始数据的需要验证,指定字段必须要传
4.Length:验证长度
5.NumberRange:数字的区间
6.Regexp:正则表达式验证
7.URL:验证是否为超链接
8.UUID:验证UUID

二、如何使用

1.视图中

from forms import RegistForm
@app.route('/regist',methods=['GET','POST'])
def regist():
    if request.method == 'GET':
        return render_template('regist.html')
    else:
        form = RegistForm(request.form)
        if form.validate():
            return '注册成功'
        else:
            print(form.errors)
            return '注册失败'

2.新建一个forms.py模块

from wtforms import Form,StringField,IntegerField
from wtforms.validators import Length,EqualTo,UUID,URL,Email,InputRequired,NumberRange,Regexp

# Email:验证上传数据是否是邮箱
# EqualTo:验证上传数据是否和另一个相等
# InputRequired:原始数据的需要验证,指定字段必须要传
# Length:验证长度
# NumberRange:数字的区间
# Regexp:正则表达式验证
# URL:验证是否为超链接
# UUID:验证UUID

class RegistForm(Form):
    username = StringField(validators=[
            Length(min=3,max=10,message="3~10位"), # 验证长度
            InputRequired(message="该值不能为空")  # 验证是否传值
        ])
    password = StringField(validators=[
        Length(min=3, max=10, message="3~10位")
    ])
    password_repeat = StringField(validators=[
        Length(min=3, max=10, message="3~10位"),
        EqualTo("password") # 验证password_repeat的值是否和password相等
    ])
    email = StringField(validators=[
        Email(message="邮箱格式不正确")
    ])
    age = IntegerField(validators=[
        NumberRange(min=0,max=100,message="该值取值区间在0-100")
    ])
    phone = StringField(validators=[
        Length(min=11,max=11),
        Regexp(r'1[3687459]\d{9}',message="手机号码格式不正确")
    ])
    url = StringField(validators=[
        URL(message="超链接格式不正确")
    ])
    uuid = StringField(validators=[
        UUID(message="UUID格式不正确")
    ])

3.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <form action="" method="post">
        <table>
            <tbody>
                <tr>
                    <td>用户名(StringField:Length):</td>
                    <td><input type="text" name="username" value="xxx"></td>
                </tr>
                <tr>
                    <td>密码(StringField:Length):</td>
                    <td><input type="password" name="password" value="123"></td>
                </tr>
                <tr>
                    <td>重复密码(StringField:Length,EqualTo):</td>
                    <td><input type="password" name="password_repeat" value="123"></td>
                </tr>
                <tr>
                    <td>email(StringField:Email):</td>
                    <td><input type="email" name="email" value="77@qq.com"></td>
                </tr>
                <tr>
                    <td>年龄(StringField:NumberRange,Length):</td>
                    <td><input type="number" name="age" value="18"></td>
                </tr>
                <tr>
                    <td>手机号码(StringField:Regexp):</td>
                    <td><input type="text" name="phone" value="18800000000"></td>
                </tr>
                <tr>
                    <td>官网(StringField:URL):</td>
                    <td><input type="text" name="url" value="http://127.0.0.1:5000/regist"></td>
                </tr>
                <tr>
                    <td>UUID(StringField:UUID):</td>
                    <td><input type="text" name="uuid" value="d8984191-075b-4ff9-b44c-ed36b709ae1f"></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" value="立即注册"></td>
                </tr>
            </tbody>
        </table>
    </form>
</body>
</html>

 三、wtforms自定义验证器

 forms.py代码如下:

from wtforms import Form,StringField,IntegerField
from wtforms.validators import Length,ValidationError
class RegistForm(Form):

    captcha = StringField(validators=[
        Length(4,4)
    ])

    # validate_验证名字(self,filed)
    def validate_captcha(self,filed):
        # filed ==> <input id="captcha" name="captcha" type="text" value="b44c">
        # filed.data ==> b44c

        # 假设服务器取到验证码为aaaa
        captcha_data = "aaaa"

        if filed.data!=captcha_data:
            
            raise ValidationError("验证码不匹配")

html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <form action="" method="post">
        <table>
            <tbody>
                <tr>
                    <td>验证码(StringField:Length):</td>
                    <td><input type="text" name="captcha" value="b44c"></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" value="立即注册"></td>
                </tr>
            </tbody>
        </table>
    </form>
</body>
</html>

四、wtforms渲染模板(功能鸡肋)

forms代码如下:

from wtforms import Form,StringField,BooleanField,SelectField
from wtforms.validators import Length,ValidationError
class RegistForm(Form):

    captcha = StringField(validators=[
        Length(4,4)
    ],label='验证码')

    tags = SelectField(
        label='爱好',
        choices=[('py','python'),('ja','java'),('cc','c++')]
    )

    remenber = BooleanField(
        label='记住我'
    )

    # validate_验证名字(self,filed)
    def validate_captcha(self,filed):
        # filed ==> <input id="captcha" name="captcha" type="text" value="b44c">
        # filed.data ==> b44c

        # 假设服务器取到验证码为aaaa
        captcha_data = "aaaa"

        if filed.data!=captcha_data:

            raise ValidationError("验证码不匹配")

app代码如下:

@app.route('/regist',methods=['GET','POST'])
def regist():
    if request.method == 'GET':
        form = RegistForm()
        return render_template('regist.html',form=form)
    else:
        form = RegistForm(request.form)
        if form.validate():
            return '注册成功'
        else:
            print(form.errors)
            return '注册失败'

html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <style>
        .ls{
            color: red;
            background:#ddff6c ;
        }
    </style>
</head>
<body>
    <form action="" method="post">
        <table>
            <tbody>
                <tr>
                    <td>{{ form.captcha.label }}:</td>
                    <td>{{ form.captcha(class='ls',id='captcha') }}</td>
                </tr>
                <tr>
                    <td>{{ form.tags.label }}:</td>
                    <td>{{ form.tags() }}</td>
                </tr>
                <tr>
                    <td>{{ form.remenber.label }}:</td>
                    <td>{{ form.remenber() }}</td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" value="立即注册"></td>
                </tr>
            </tbody>
        </table>
    </form>
</body>
</html>

 

posted @ 2020-03-05 17:07  我在地球凑人数的日子  阅读(536)  评论(0编辑  收藏  举报