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>