Fork me on GitHub

Flask学习笔记(十四)-Flask_WTF自定义验证器and上传文件表单验证

一、Flask高级_WTF自定义验证器

1、自定义验证器说明

定义一个方法,方法的名字规则是: validate_字段名(self,field) 。
在方法中,使用 field.data 可以获取到这个字段的具体的值(前端的)。
验证时,如果数据满足条件,那么可以什么都不做。如果验证失败,那么应该抛出一个 wtforms.validators.ValidationError 的异常,并且把验证失败 的信息传到这个异常类中。

2.实例

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录页面</title>
</head>
<body>
    <form action="/login/" method="post">
        <table>
            <tr>
                <th>用户名:</th>
                <td><input type="text" name="uname"></td>
            </tr>
            <tr>
                <th>密码:</th>
                <td><input type="text" name="pwd"></td>
            </tr>
            <tr>
                <th>验证码:</th>
                <td><input type="text" name="code" maxlength="4"> <span style="background-color: aqua;">{{code}}</span></td>
            </tr>
            <tr>
                <th></th>
                <td><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>
</body>
</html>

loginForm.py:

from flask import session
from wtforms import Form,StringField
from wtforms.validators import Length,ValidationError

class loginForm(Form):
#code验证
code = StringField(validators=[Length(4,4)])
def validate_code(self,field):
"""
:自定义验证
:return:
"""
font_code = field.data #code对应code随机数据
server_code = str(session.get('code')) #获取表单name对应输入的内容
if font_code != server_code:
raise ValidationError('验证码不一致!!!请重新输入!')

app.py:

#coding=utf-8
from flask import Flask,render_template,request,session
from random import randint
from loginForm import loginForm
app = Flask(__name__)
app.secret_key = 'adada'
@app.route('/')
def index():
return 'Hello~'
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET':
code = randint(1000,9999) #code随机值
session['code'] = code
return render_template('login.html',code=code)
else:
form = loginForm(request.form)
if form.validate():
return '验证成功!'
return f'验证失败!失败信息:{form.errors}'
if __name__ == '__main__':
app.run(debug=True)

验证结果-成功:

 验证结果失败:

 

二、Flask_wtf文件上传验证

1、利用flask-wtf验证上传的文件

  1. 定义验证表单类的时候,对文件类型的字段,需要采用FileField这个类型,即wtforms.FileField。

  2. 验证器需要从flask_wtf.file中导入。flask_wtf.file.FileRequired和flask_wtf.file.FileAllowed

  3. flask_wtf.file.FileRequired是用来验证文件上传不能为空。

  4. flask_wtf.file.FileAllowed用来验证上传的文件的后缀名, 如常见图片后缀.jpg和.png以及.gif等。

  5. 在视图函数中,需要使用from werkzeug.datastructures import CombinedMultiDict来把request.form与request.files来进行合并。

  6. 最后使用 表单验证对象.validate()进行验证。

2、实例

目录文件展示:

flask_test01:
  images                         --存放图片文件
   templates                       --模板存放目录
    --upload.html
  app.py                          --项目启动文件
  form.py                         --表单验证文件

 upload.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
 <form action="" method="post" enctype="multipart/form-data">
 <table>
 <tr>
 <td>头像:</td>
 <td><input type="file" name="pichead"></td>
 </tr>
 <tr>
 <td>描述:</td>
 <td><input type="text" name="desc"></td>
 </tr>
 <tr>
 <td></td>
 <td><input type="submit" value="提交"></td>
 </tr>
 </table>
 </form>
</body>
</html>

form.py 表单验证文件: 

from wtforms import Form,FileField,StringField
from wtforms.validators import InputRequired
#flask_wtf.file.FileRequired`是用来验证文件上传不能为空。
#flask_wtf.file.FileAllowed`用来验证上传的文件的后缀名
from flask_wtf.file import FileRequired,FileAllowed

class UploadForm(Form):
    pichead = FileField(validators=[FileRequired(),FileAllowed(['jpg','png','gif','jpeg'])])
    desc = StringField(validators=[InputRequired()])

app.py项目启动文件:

from flask import Flask,request,render_template
import os
from werkzeug.utils import secure_filename
from form import UploadForm
from werkzeug.datastructures import CombinedMultiDict
app = Flask(__name__)
UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images')
@app.route('/upload/',methods=['GET','POST'])
def upload():
    if request.method=="GET":
        return render_template('upload.html')
    else:
        form =UploadForm(CombinedMultiDict([request.form,request.files]))
        if form.validate():
            # desc=request.form.get("desc")
            # pichead=request.files.get("pichead")
            desc = form.desc.data
            pichead = form.pichead.data
            filename = secure_filename(pichead.filename)
            pichead.save(os.path.join(UPLOAD_PATH, filename))
            print(desc)
            return '文件上传成功'
        else:
            print(form.errors)
            return "文件上传失败"


if __name__ == '__main__':
    app.run()

执行结果:

访问url:http://127.0.0.1:5000/upload/

 点击提交:

 

  

  

 

 

  

posted @ 2022-10-21 17:32  橘子偏爱橙子  阅读(258)  评论(0编辑  收藏  举报