WTForms表单验证

WTForms表单验证

  • Flask-WTF

    • Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。当然还包括一些其他的功能:CSRF保护,文件上传等。安装Flask-WTF默认也会安装WTForms,因此使用以下命令来安装Flask-WTF
      pip install flask-wtf
      
  • 表单验证

    • 安装完Flask-WTF后。来看下第一个功能,就是用表单来做数据验证,现在有一个forms.py文件,然后在里面创建一个RegistForm的注册验证表单
      class RegistForm(Form):
          name = StringField(validators=[length(min=4,max=25)])
          email = StringField(validators=[email()])
          password = StringField(validators=[DataRequired(),length(min=6,max=10),EqualTo('confirm')])
          confirm = StringField()
      
    • 在这个里面指定了需要上传的参数,并且指定了验证器,比如name的长度应该在4-25之间。email必须要满足邮箱的格式。password长度必须在6-10之间,并且应该和confirm相等才能通过验证
    • 写完表单后,接下来就是regist.html文件
      <form action="/regist/" method="POST">
          <table>
              <tr>
                  <td>用户名:</td>
                  <td><input type="text" name="name"></td>
              </tr>
              <tr>
                  <td>邮箱:</td>
                  <td><input type="email" name="email"></td>
              </tr>
              <tr>
                  <td>密码:</td>
                  <td><input type="password" name="password"></td>
              </tr>
              <tr>
                  <td>确认密码:</td>
                  <td><input type="password" name="confirm"></td>
              </tr>
              <tr>
                  <td></td>
                  <td><input type="submit" value="提交"></td>
              </tr>
          </table>
      </form>
      
    • 再来看视图函数regist
      @app.route('/regist/',methods=['POST','GET'])
      def regist():
          form = RegistForm(request.form)
          if request.method == 'POST' and form.validate():
              user = User(name=form.name.data,email=form.email.data,password=form.password.data)
              db.session.add(user)
              db.session.commit()
              return '注册成功!'
          return render_template('regist.html')
      
    • RegistForm传递的是request.form进去进行初始化,并且判断form.validate会返回用户提交的数据是否满足表单的验证
  • 渲染模板

    • form还可以渲染模板,让你少写了一丢丢的代码,比如重写以上例子,RegistForm表单代码如下
      class RegistForm(Form):
          name = StringField('用户名:',validators=[length(min=4,max=25)])
          email = StringField('邮箱:'validators=[email()])
          password = StringField('密码:',validators=[DataRequired(),length(min=6,max=10),EqualTo('confirm')])
          confirm = StringField('确认密码:')
      
    • 以上增加了第一个位置参数,用来在html文件中,做标签提示作用。
    • 在app中的视图函数中,修改为如下
      @app.route('/regist/',methods=['POST','GET'])
      def regist():
          form = RegistForm(request.form)
          if request.method == 'POST' and form.validate():
              user = User(name=form.name.data,email=form.email.data,password=form.password.data)
              db.session.add(user)
              db.session.commit()
              return '注册成功!'
          return render_template('regist.html',form=form)
      
    • 以上唯一的不同是在渲染模板的时候传入了form表单参数进去,这样在模板中就可以使用表单form变量了。
    • 接下来看下regist.html文件
      <form action="/regist/" method="POST">
          <table>
              <tr>
                  <td>{{ form.name.label }}</td>
                  <td>{{ form.name() }}</td>
              </tr>
              <tr>
                  <td>{{ form.email.label }}</td>
                  <td>{{ form.email() }}</td>
              </tr>
              <tr>
                  <td>{{ form.password.label }}</td>
                  <td>{{ form.password() }}</td>
              </tr>
              <tr>
                  <td>{{ form.confirm.label }}</td>
                  <td>{{ form.confirm() }}</td>
              </tr>
              <tr>
                  <td></td>
                  <td><input type="submit" value="提交"></td>
              </tr>
          </table>
      </form>
      
  • 文件上传

    • 1、在模版中,form表单中,需要指定encotype='multipart/form-data’才能上传文件。
    • 2、在后台如果想要获取上传的文件,那么应该使用request.files.get(‘avatar’)来获取。
    • 3、保存文件之前,先要使用werkzeug.utils.secure_filename来对上传上来的文件名进行一个过滤。这样才能保证不会有安全问题。
    • 4、获取到上传上来的文件后,使用avatar.save(路径)方法来保存文件。、
    • 5、从服务器上读取文件,应该定义一个url与视图函数,来获取指定的文件。在这个视图函数中,使用send_from_directory(文件的目录,文件名)来获取。
      @app.route('/upload/',methods=['GET','POST'])
      def upload():
          if request.method == 'GET':
              return render_template('upload.html')
          else:
              # 获取描述信息
              desc = request.form.get("desc")
              avatar = request.files.get("avatar")
              filename = secure_filename(avatar.filename)
              avatar.save(os.path.join(UPLOAD_PATH,filename))
              print(desc)
              return '文件上传成功'
      
      @app.route('/images/<filename>/')
      def get_image(filename):
          return send_from_directory(UPLOAD_PATH,filename)
      
  • 对上传文件使用表单验证:

    • 1、定义表单的时候,对文件的字段,需要采用FileField这个类型。
    • 2、验证器应该从flask_wtf.file中导入。flask_wtf.file.FileRequired是用来验证文件上传是否为空。flask_wtf.file.FileAllowed用来验证上传的文件的后缀名。
    • 3、在视图文件中,使用from werkzeug.datastructures import CombinedMultiDict来把request.form与request.files来进行合并。再传给表单来验证。
      from werkzeug.datastructures import CombinedMultiDict
      form = UploadForm(CombinedMultiDict([request.form,request.files]))
      
  • 解决中文问题:https://blog.csdn.net/qq_36390239/article/details/98847888

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值