欢迎访问宙启技术站
智能推送

PythonFlask-WTF文件上传和删除功能详解

发布时间:2023-12-11 06:20:06

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 实现文件上传和删除功能的详细过程。通过上传和删除处理函数的代码和相应的模板,可以方便地实现这一功能。