Flask框架【WTForms介绍和基本使用、WTForms自定义验证器、WTForms渲染模版】(八)

作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
如果感觉博主的文章还不错的话,请三连支持一下博主哦
博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

python入门到实战专栏:从入门到实战 

Python爬虫开发专栏:从入门到实战

 Python办公自动化专栏:从入门到实战

Python数据分析专栏:从入门到实战

Python前后端开发专栏:从入门到实战

文章目录

WTForms介绍和基本使用

WTForms自定义验证器

WTForms渲染模版


WTForms介绍和基本使用

Flask框架【WTForms介绍和基本使用、WTForms自定义验证器、WTForms渲染模版】(八)_第1张图片

WTForms介绍

这个插件库主要有两个作用。
第一个是做表单验证,将用户提交上来的数据进行验证是否符合系统要求。
第二个是做模版渲染。 (了解即可)
官网:https://wtforms.readthedocs.io/en/latest/index.html

Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。而Flask-WTF还包括一些其他的功能:CSRF保护,文件上传等。


安装Flask-WTF默认也会安装WTForms,因此使用以下命令来安装Flask-WTF和WTForms:

pip install flask-wtf

WTForms表单验证的基本使用

1、自定义一个表单类,继承自wtforms.Form类。

2、定义好需要验证的字段,字段的名字必须和模版中那些需要验证的input标签的name属性值保持一致。
3、在需要验证的字段上,需要指定好具体的数据类型。

4、在相关的字段上,指定验证器。

5、以后在视图函数中,只需要使用这个表单类的对象,并且把需要验证的数据,也就是request.form传给这个表单类,再调用表单类对象.validate()方法进行,如果返回True,那么代表用户输入的数据都是符合格式要求的,Flase则代表用户输入的数据是有问题的。如果验证失败了,那么可以通过表单类对象.errors来获取具体的错误信息。




    
    某系统注册页面


                                                                                                                                                                                                                                       
用户名:
密码:
确认密码:
from flask import
Flask,render_template,request
from wtforms import Form,StringField
from wtforms.validators import
Length,EqualTo

app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello! '

class RegisterForm(Form):
    uname = StringField(validators=[Length(min=2,max=10,message='用户名长度2-10之间')])
    pwd = StringField(validators= [Length(min=2,max=10)])
    pwd2 = StringField(validators= [Length(min=2,max=10),EqualTo('pwd',message= '2次密码不一致')])

@app.route('/register/', methods= ['GET','POST'])
def register():
    if request.method == 'GET':
        return  render_template('register.html')
    else:
        form = RegisterForm(request.form)
        if form.validate():  # 验证成功:True,失败:False
            return '验证成功!'
        else:
            return f'验证失败!{form.errors}'


if __name__ == '__main__':
    app.run(debug=True)



WTForms常用验证器

Flask框架【WTForms介绍和基本使用、WTForms自定义验证器、WTForms渲染模版】(八)_第2张图片

页面把数据提交上来,需要经过表单验证,进而需要借助验证器来进行验证,以下是常用的内置验证器:

1. Length:字符串长度限制,有min和max两个值进行限制。

username = StringField(validators= [Length(min=3,max=10,message="用户名长度必须在3到10位之间")])

2. EqualTo:验证数据是否和另外一个字段相等,常用的就是密码
和确认密码两个字段是否相等。

password_repeat = StringField(validators= [Length(min=6,max=10),EqualTo("password")])

3. Email:验证上传的数据是否为邮箱数据格式 如:[email protected]

email = StringField(validators=[Email()])

4. InputRequired:验证该项数据为必填项,即要求该项非空。

username = StringField(validators= [input_required()])

5. NumberRange:数值的区间,有min和max两个值限制,如果处在这两个数字之间则满足。

age = IntegerField(validators= [NumberRange(12,18)])

6. Regexp:定义正则表达式进行验证,如验证手机号码。

phone = StringField(validators=[Regexp(r'1[34578]\d{9}')])

7. URL:必须是URL的形式 如http://www.xiaotong.com。

home_page = StringField(validators=[URL()])

8. UUID:验证数据是UUID类型。

uuid = StringField(validators=[UUID()])

数据项的类型,一般常用的有

from wtforms import
Form,StringField,IntegerField
class RegisterForm2(Form):
    uname = StringField(validators= [InputRequired()])
    age = IntegerField(validators= [NumberRange(18,40)])

register.html文件




    
    注册页面


  
                                                                                                                                                                                                                                                                                                                                                                                                               
邮箱:
用户名:
年龄:
手机号码:
个人主页:
uuid:

formscheck.py表单验证工具类文件

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

class RegisterForm(Form):
    uname =StringField(validators= [Length(min=2,max=15,message='用户名长度必须在2-15之间')])
    pwd = StringField(validators= [Length(min=6,max=12)])
    pwd2 = StringField(validators= [Length(min=6,max=12),EqualTo("pwd")])

class RegisterForm2(Form):
    email = StringField(validators= [Email()])
    uname = StringField(validators= [InputRequired()])
    age = IntegerField(validators= [NumberRange(18,40)])
    phone = StringField(validators= [Regexp(r'1[34578]\d{9}')])
    phomepage = StringField(validators= [URL()])
    uuid = StringField(validators=[UUID()])

app.py文件

from flask import
Flask,request,render_template
from formscheck import
RegisterForm,RegisterForm2
app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template("register.html")

#基本使用
@app.route('/register/',methods= ['GET','POST'])
def register():
    if request.method == 'GET':
        return  render_template('register.html')
    else:
        form = RegisterForm(request.form)
        if form.validate(): #验证   要么ok 要么no
            return "验证通过"
        else:
            print(form.errors)
            return "数据验证通不过"

#常用验证器使用
@app.route('/register2/',methods= ['GET','POST'])
def login():
    if request.method == 'GET':
        return  render_template("register2.html")
    else:
        form = RegisterForm2(request.form)
        if form.validate():
            return "验证OK"
        else:
            print(form.errors)
            return "验证失败"
import uuid
print(uuid.uuid4())#edbfa1d6-28f2-4f40-9111-528141a8e77d


if __name__ == '__main__':
    app.run(debug=True)

WTForms自定义验证器

Flask框架【WTForms介绍和基本使用、WTForms自定义验证器、WTForms渲染模版】(八)_第3张图片

只有当WTForms内置的验证器不够使的时候,才需要使用自定义验证器。
如果想要对表单中的某个字段进行更细化的验证,那么可以针对这个字段进行单独的验证。

自定义验证器步骤如下:

1、 定义一个方法,方法的名字规则是: validate_字段名(self,field)
2、 在方法中,使用 field.data 可以获取到这个字段的具体的值。
3、 验证时,如果数据满足条件,那么可以什么都不做。如果验证失败,

那么应该抛出一个 wtforms.validators.ValidationError 的异常,并且把验证失败的信息传到这个异常类中。

场景:验证码实现

关键代码演示:(实现验证码 验证)

from  flask import session
from wtforms import
Form,StringField,IntegerField
from wtforms.validators import
Length,EqualTo,Email,InputRequired,NumberRan
ge,Regexp,URL,UUID,ValidationError

class RegisterForm2(Form):
    email = StringField(validators= [Email()])
    uname = StringField(validators= [InputRequired()])
    age = IntegerField(validators= [NumberRange(18,40)])
    phone = StringField(validators= [Regexp(r'1[34578]\d{9}')])
    phomepage = StringField(validators= [URL()])
    uuid = StringField(validators=[UUID()])
    code = StringField(validators= [Length(4,4)])
    #取到的值 和服务器上 session上存储的值对比
    def validate_code(self,field):
      print(field.data,session.get('code'))
        if field.data != session.get('code'):
            raise ValidationError('验证码不一致!')

WTForms渲染模版

Flask框架【WTForms介绍和基本使用、WTForms自定义验证器、WTForms渲染模版】(八)_第4张图片

渲染模版是WTForms的第二个作用,不过,我们只需要了解即可,不需要花太多精力和时间去研究它。

formscheck.py文件

from wtforms import
Form,StringField,IntegerField,BooleanField,S
electField,DateField
from wtforms.validators import
Length,EqualTo,Email,InputRequired,NumberRan
ge,Regexp,URL,UUID,ValidationError
#渲染模版
class CreateForm(Form):
    uname = StringField("用户名:",validators= [InputRequired()])
    age = IntegerField("年龄:",validators = [NumberRange(18,40)])
    remember = BooleanField("记住我:")
    addr = SelectField('地址:',choices= [('bj',"北京"),('sj','上海'),('tj','天津')])

app.py文件

from flask import Flask,render_template
from formscheck import CreateForm

#WTForms渲染模版 了解
@app.route('/createform/')
def createform():
        form = CreateForm()
        return  render_template('create_form.html',form=form)

if __name__ == '__main__':
    app.run(debug=True)

create_form.html文件




    
    Title
        


     

WTForms创建表单

   
                                                                                                                                                                                                                                                                                                                                                                                       
{{ form.uname.label}}{{ form.uname(class='hot') }}
{{ form.age.label }}{{ form.age() }}
{{ form.remember.label }}{{ form.remember()}}
{{ form.addr.label}}{{ form.addr() }}
   

Flask框架【WTForms介绍和基本使用、WTForms自定义验证器、WTForms渲染模版】(八)_第5张图片

你可能感兴趣的:(Python框架入门到实战,python,Flask,WTForms)