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

PythonFlask-WTF文件批量下载功能实现

发布时间:2023-12-11 06:22:15

Python Flask是一个基于Python的Web开发框架,而WTForms是一个用于构建Web表单的Python的库。本文将介绍如何使用Python Flask和WTForms实现一个文件批量下载功能,并提供一个使用例子。

一、安装依赖库

首先,需要确保已安装Python Flask和WTForms。可以在终端中输入以下命令进行安装(需要提前安装好pip):

pip install flask
pip install wtforms

二、创建Flask应用

接下来,我们创建一个Python文件,并导入必要的模块,包括Flask和WTForms:

from flask import Flask, render_template, request, send_from_directory
from wtforms import Form, MultipleFileField, SubmitField

然后,创建一个Flask应用:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'

三、创建表单类

接下来,我们需要创建一个表单类,用于接收用户上传的文件:

class FileForm(Form):
    files = MultipleFileField('Files')
    submit = SubmitField('Download')

这个表单类包含一个MultipleFileField用于接收多个文件的上传,并有一个submit按钮用于触发下载功能。

四、创建视图函数

然后,我们创建一个视图函数,用于处理用户的请求并返回相应的页面:

@app.route('/', methods=['GET', 'POST'])
def index():
    form = FileForm(request.form)

    if request.method == 'POST' and form.validate():
        filenames = []
        for file in form.files.data:
            filename = secure_filename(file.filename)
            file.save(filename)
            filenames.append(filename)
        return render_template('download.html', filenames=filenames)

    return render_template('index.html', form=form)

这个视图函数接受GET和POST请求,并在GET请求时渲染index.html模板,同时传递一个表单实例。

在POST请求时,首先验证表单的数据是否有效。如果有效,就保存所有上传的文件,并将文件名保存到一个列表中。

然后,将这个文件名列表传递到download.html模板中进行渲染,显示出下载链接。

五、创建模板

在templates目录下创建两个模板文件:index.html和download.html。

index.html模板文件的内容如下:

<!DOCTYPE html>
<html>
  <head>
    <title>File Upload</title>
  </head>
  <body>
    <h1>File Upload</h1>
    <form method="POST" enctype="multipart/form-data">
      {{ form.csrf_token }}
      {{ form.files }}
      {{ form.submit }}
    </form>
  </body>
</html>

这个模板文件包含一个表单,使用POST方法提交数据,并使用enctype属性为multipart/form-data,以支持文件上传。然后,渲染表单的csrf_token字段、files字段和submit字段。

download.html模板文件的内容如下:

<!DOCTYPE html>
<html>
  <head>
    <title>File Download</title>
  </head>
  <body>
    <h1>File Download</h1>
    <ul>
      {% for filename in filenames %}
      <li>
        <a href="{{ url_for('download', filename=filename) }}">{{ filename }}</a>
      </li>
      {% endfor %}
    </ul>
  </body>
</html>

这个模板文件根据传递的文件名列表,生成多个下载链接。

六、创建文件下载路由

最后,我们创建一个文件下载的路由:

@app.route('/download/<path:filename>')
def download(filename):
    directory = os.getcwd()
    return send_from_directory(directory, filename, as_attachment=True)

这个路由将接受一个文件名参数,并使用send_from_directory函数,从当前目录获取文件,并以附件形式返回给用户。

七、运行应用

在Python文件的最后加入以下代码:

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

然后,运行这个Python脚本,即可启动Flask应用。

八、使用例子

在浏览器中访问http://localhost:5000,即可看到一个文件上传的页面。

选择多个文件并点击上传按钮后,将跳转到下载页面,显示上传的文件列表,并提供下载链接。

点击下载链接后,即可开始下载相应的文件。

总结

本文介绍了如何使用Python Flask和WTForms实现一个文件批量下载的功能,并提供了一个完整的使用例子。你可以根据自己的需求进行修改和扩展,实现更复杂的功能。