Flask-WTF —— 文件上传验证

Flask 学习笔记

一、文件上传验证


1.1、文件上传

  1. 在模版中,form 表单中,需要指定 encotype='multipart/form-data' 才能上传文件。

  2. 在后台如果想要获取上传的文件,那么应该使用 request.files.get('avatar') 来获取。

  3. 保存文件之前,先要使用 werkzeug.utils.secure_filename 来对上传上来的文件名进行一个过滤。这样才能保证不会有安全问题。

  4. 获取到上传上来的文件后,使用 avatar.save(路径) 方法来保存文件。

  5. 从服务器上读取文件,应该定义一个 url 与视图函数,来获取指定的文件。在这个视图函数中,使用 send_from_directory(文件的目录, 文件名) 来获取。


        index.html

	
	
	<form action="" method="post" enctype="multipart/form-data">
	    <table>
	        <tr>
	            <td>头像td>
	            <td><input type="file" name="image_file">td>
	        tr>
	        <tr>
	            <td>描述td>
	            <td><input type="text" name="desc">td>
	        tr>
	        <tr>
	            <td><input type="submit" value="上传">td>
	        tr>
	    table>
	form>

        upload_demo.py

	from flask import Flask, request, render_template, send_from_directory
	from werkzeug.utils import secure_filename
	
	app = Flask(__name__)
	
	
	@app.route("/")
	def index():
	    return "首页"
	
	
	@app.route("/upload/", methods=['GET', 'POST'])
	def upload():
	    if request.method == "GET":
	        return render_template("upload.html")
	    else:
	        # 获取 post 提交的数据
	        desc = request.form.get('desc')
	        print(desc)
	        # 获取提交文件的数据
	        image_file = request.files.get('image_file')
	        print(image_file)
	
	        # image_file.filename 是文件的名字
	        print(image_file.filename)
	
	        # 获得文件的后缀
	        file_name = secure_filename(image_file.filename)
	        print(file_name)
	
	        # 保存文件到 images 文件夹
	        # save(文件路径)
			image_file.save(f'images/{image_file.filename}')
	
	        return "文件上传成功"


	# http://127.0.0.1:5000/images/123.jpg
	@app.route("/images/")
	def get_image(filename):
	    return send_from_directory('images', filename)
	
	
	if __name__ == '__main__':
	    app.run(debug=True)



1.2、对上传的文件进行验证

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

  2. 验证器应该从 flask_wtf.file 中导入 FileRequired 是用来验证文件上传是否为空。导入 FileAllowed 用来验证上传的文件的后缀名。

  3. 在视图文件中,从 werkzeug.datastructures 导入 CombinedMultiDict 来把 request.formrequest.files 进行合并,再传给表单来验证。


        forms.py

	from wtforms import Form, FileField, StringField
	from wtforms.validators import InputRequired
	from flask_wtf.file import FileAllowed, FileRequired
	
	
	class UploadForm(Form):
	    # FileRequired 文件必须传
	    # FileAllowed 允许上传的类型
	    image_file = FileField(validators=[FileRequired(), FileAllowed(['jpg', 'png', 'gif'])])
	    desc = StringField(validators=[InputRequired()])

        upload_demo.py 文件只需加一个判断即可

	@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():
	        	...
	        	...
	        	return "文件上传成功"
	        
	        else:
	            print(form.errors)
	            return "fail"

另外,以下几条获取数据的语句也可以相互替换:

	# 获取post 提交的数据
	desc = request.form.get('desc')
	
	desc = form.desc.data
	# 获取提交文件的数据
	image_file = request.files.get('image_file')
	
	image_file = form.image_file.data

你可能感兴趣的:(Flask)