PythonFlask-WTF文件上传和删除功能详解
Python Flask-WTF 是 Flask 框架的一个插件,可以方便地处理HTML表单。在这篇文章中,我们将重点介绍 Flask-WTF 中的文件上传和删除功能,并提供相应的使用例子。
1. 安装和导入相关库
要使用 Flask-WTF,我们首先需要安装 Flask-WTF 库。在终端中运行以下命令进行安装:
pip install Flask-WTF
然后在代码中导入 Flask、Flask-WTF 和相应的表单类:
from flask import Flask, render_template, request, redirect from flask_wtf import FlaskForm from wtforms import FileField, SubmitField from werkzeug.utils import secure_filename import os
2. 设置 Flask App
在代码中创建 Flask App,并设置一个秘钥用于 CSRF 保护:
app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key'
3. 创建上传表单
创建一个继承自 FlaskForm 的表单类,添加一个 FileField 用于接收文件,再添加一个 SubmitField 用于提交表单。
class UploadForm(FlaskForm):
file = FileField('选择文件')
submit = SubmitField('上传')
4. 创建上传和删除路由
添加一个上传文件的路由,用来处理文件上传请求。在上传文件的路由处理函数中,首先从 request.files 中获取到文件,然后使用 secure_filename 函数对文件名进行安全处理,并将文件保存在指定的文件夹中。
@app.route('/upload', methods=['GET', 'POST'])
def upload():
form = UploadForm()
if form.validate_on_submit():
file = form.file.data
filename = secure_filename(file.filename)
file.save(os.path.join(app.instance_path, 'uploads', filename))
return redirect('/')
return render_template('upload.html', form=form)
添加一个删除文件的路由,用来处理文件删除请求。首先获取到要删除的文件路径,然后使用 os.remove 函数删除文件。
@app.route('/delete', methods=['POST'])
def delete():
filepath = request.form.get('filepath')
os.remove(filepath)
return redirect('/')
5. 创建模板和视图
创建一个 HTML 模板,用于展示文件上传和删除功能。
<!DOCTYPE html>
<html>
<head>
<title>文件上传和删除</title>
</head>
<body>
<h1>文件上传和删除</h1>
<form method="POST" action="/upload" enctype="multipart/form-data">
{{ form.csrf_token }}
{{ form.file.label }} {{ form.file }}
{{ form.submit }}
</form>
<br>
<ul>
{% for filename in filenames %}
<li>
<a href="{{ url_for('static', filename='uploads/' + filename) }}" download>{{ filename }}</a>
<form method="POST" action="/delete">
{{ form.csrf_token }}
<input type="hidden" name="filepath" value="{{ url_for('static', filename='uploads/' + filename) }}">
<input type="submit" value="删除">
</form>
</li>
{% endfor %}
</ul>
</body>
</html>
创建一个视图函数用于渲染上述模板,同时获取上传文件夹中的所有文件名。
@app.route('/')
def index():
form = UploadForm()
filenames = os.listdir(os.path.join(app.instance_path, 'uploads'))
return render_template('index.html', form=form, filenames=filenames)
6. 启动 Flask App
在代码的最后,添加以下代码用于启动 Flask App:
if __name__ == '__main__':
app.run()
7. 运行示例
在终端中运行脚本,并访问 http://localhost:5000 进行测试。您可以选择一个文件进行上传,并在页面中看到已上传的文件列表。点击“删除”按钮可以删除对应的文件。
这就是使用 Flask-WTF 实现文件上传和删除功能的详细过程。通过上传和删除处理函数的代码和相应的模板,可以方便地实现这一功能。
