wtforms第三方库 验证、自定义验证
一、常规验证方法:
from wtforms import StringField, PasswordField, Form,simple,widgets,validators
from wtforms.validators import Length, Email,ValidationError, EqualTo,Regexp,DataRequired,URL,AnyOf,NoneOf,UUID
class LoginForm(Form):
pwd = PasswordField( )
name =StringField(
label='字段的名字',
validators=[
DataRequired(message='用户名不能为空.'),
Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d'),
Email(message='邮箱格式错误'),
EqualTo('pwd', message="两次密码输入不一致")
Regexp(regex="\d+",message="密码必须是数字")
Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",
message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')
Regexp(r'1[3,5,6,7,8]\d{9}',message='手机号码11位,1开头 第二位 3 5 6 7 8开始的.')
URL(message='输入正确的url地址')
AnyOf(["1","2","3"],message='确保输入值在可选值列表中')
NoneOf(["1","2","3"],message='确保输入值不在可选值列表中')
UUID(message='输入的字符不是UUID(校验字符是否是UUID)')
]
)
前端
有2种写法 获取某个字段的错误信息还可以 {{form.pwd.errors[0] }}
<input id="pawd" style="width:100%" name="pwd" placeholder="密码">
<p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p> 可以参考下面和上面的url ,可以在 wtforms 校验类里面写好前端的展示字段的
参考:
https://www.cnblogs.com/wdliu/p/10183645.html
https://blog.csdn.net/aaronthon/article/details/81714513
二、自定义校验的写法:
class LoginForm(Form):
user_id =StringField(
label='用户名',
validators=[
DataRequired(message='usr_id不能为空.')]
)
def validate_user_id(self, field):
# 通过.data 获取到前端传入数据, 与数据库中保存验证码对比。 不相等 通过raise 抛出ValidationError异常
# 在ValidationError中填写错误提示信息, 错误信息可通过 form.errors 获取到
if (field.data == 123 ):
pass
else:
raise ValidationError('请输入符合要求的user_id!!')
整体
前端模版
<div>
{% if form and form.errors %}
{% for key, error in form.errors.items() %}
<div>{{ error }}</div>
{% endfor %}
{% endif %}
#错误信息输出 这里貌似还可以 form.user_id.errors 获取对应字段的错误信息
<div>
<form action="{{ url_for('web.register') }}" method="post">
<input style="width:100%" id="nickname" name="nickname"
type="text"
placeholder="昵称"
value="{{ form.data['nickname'] | default('',true) }}">
<input style="width:100%" id="email" name="email" type="text"
placeholder="邮箱"
value="{{ form.data['email'] | default('',true) }}">
<input id="password" style="width:100%"
name="password"
placeholder="密码"
type="password">
<input style="margin-top:15px;" id="btn-submit" type="submit"
value="注册">
</form>
</div>
后端:
from wtforms import StringField, PasswordField, Form,simple,widgets
from wtforms.validators import Length, Email,ValidationError, EqualTo,Regexp,DataRequired
class LoginForm(Form):
user_id =StringField(
label='用户名',
validators=[
DataRequired(message='usr_id不能为空.')]
)
def validate_user_id(self, field):
# 通过.data 获取到前端传入数据, 与数据库中保存验证码对比。 不相等 通过raise 抛出ValidationError异常
# 在ValidationError中填写错误提示信息, 错误信息可通过 form.errors 获取到
if (field.data in ["22343","332"]):
pass
else:
raise ValidationError('请输入符合要求的user_id!!')
@app.route('/lucax', methods=['GET', 'POST'])
def Check():
form = LoginForm(formdata=request.form)
if request.method == 'POST':
if form.validate():
try:
print('用户提交数据通过格式验证,提交的值为:',form.data['user_id'],file = sys.stderr) #获取数据还可以 这种写法 # form.password.data
main(int(form.data['user_id']))
flash("执行成功,数据已删除",category='warning')
return render_template('a.html',form=form)
except:
flash("执行异常,请联系管理员排查问题,并记录提交的user_id",category='warning')
return render_template('a.html',form=form)
else:
print(form.errors,file = sys.stderr)
return render_template('a.html',form=form)
else:
return render_template('a.html')
后记:
有时候两个字段的校验有相同的地方,可以使用继承
class LoginForm(Form):
user_id =StringField(
label='用户名',
validators=[
DataRequired(message='usr_id不能为空.')]
)
class LoginForm2(LoginForm,Form):
user_id =StringField(
label='用户名',
validators=[
DataRequired(message='usr_id不能为空.')]
)