一、常规验证方法:
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不能为空.\')]
)