wtforms第三方库 验证、自定义验证

时间:2024-03-09 13:35:33

一、常规验证方法:

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)\')

]

)

 

参考: https://blog.csdn.net/u011146423/article/details/84564637?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-13.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-13.nonecase

 

前端

有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!!\')

参考: https://blog.csdn.net/weixin_45927049/article/details/105317510?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4

 

 

 

整体

前端模版

<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不能为空.\')]
  )