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验证上传的文件
-
定义验证表单类的时候,对文件类型的字段,需要采用FileField这个类型,即wtforms.FileField。
-
验证器需要从flask_wtf.file中导入。flask_wtf.file.FileRequired和flask_wtf.file.FileAllowed
-
flask_wtf.file.FileRequired是用来验证文件上传不能为空。
-
flask_wtf.file.FileAllowed用来验证上传的文件的后缀名, 如常见图片后缀.jpg和.png以及.gif等。
-
在视图函数中,需要使用from werkzeug.datastructures import CombinedMultiDict来把request.form与request.files来进行合并。
-
最后使用 表单验证对象.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/

点击提交:

本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/16801077.html

浙公网安备 33010602011771号