如何显示html,然后使用Flask重定向到下载文件

时间:2019-11-09 02:35:50

标签: python flask

我完全不熟悉Flask和Web开发,因此请忽略我可能使用的任何缺乏适当术语的语言。

我正在尝试显示一个页面,告诉用户其文件正在打包。完成后端的包装后,我想将它们重定向回它们来自的页面,并向他们发送文件以进行下载。

我仅限于将Flask和Python 2.7用于此任务。

我尝试将html和send_file(path_to_file)函数都作为一个元组返回,并尝试为send_file()函数创建一个新线程,但是都没有用。

我不知道下一步该怎么做。

以下代码显示了我现在所在的位置:


import backend
import threading
from flask import request, send_file

def get_package(post_data):
    file_path = backend.get_package(post_data)
    return send_file(file_path)

@app.route("/pkg_download", method=['POST'])
def pkg_download():
    post_data = dict(request.form.iterlists())
    result = threading.Thread(None, target=get_package, args=[post_data])
    result.start()

    html_dialog = "<p>Packaging Images</p>"
    return html_dialog

运行上面的命令时,出现此错误:

RuntimeError: Working outside of application context.

而不是显示html,然后在打包完成后下载文件。

但是,再次重申,我真的不知道我在做什么,这可能是解决此问题的完全错误的方法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

不应在直接向服务器发送的API请求中完成您要执行的操作。创建档案可能需要一些时间,通常最好直接响应收到的请求并启动后台任务以执行更长的操作。

较长的操作成功后,您可以向客户端发送一条消息,告诉客户归档文件已可供他下载。

实施主张:

  • 您的前端将请求与用户要压缩的文件一起发送到Flask服务器
  • 您在Flask上收到文件并将其保存在某处
  • 在同一功能中,您将启动一个Celery任务,其中包含有关发出请求的客户端及其上载文件的路径的信息
  • 您在celery任务中压缩文件,成功后您可以向用户发送通知(要发送通知,您可以使用发送到前端的websocket)

此实现将允许您编写以下逻辑,并在网站的前端具有此行为:

  • 创建一个连接到后端的Websocket,该Websocket将允许您与客户端进行通信
  • 用户选择要压缩的文件
  • 您开始将它们发送到服务器(Flask API)
  • 您在一条加载消息中说他的文件当前正在上传
  • 收到API请求的答案时,您会显示一条消息,指示文件上传成功
  • 您在一条消息中说服务器当前正在处理他的文件压缩
  • 当您前端收到带有存档链接的网络套接字时,您会相应地向用户显示它

瞧,你应该很好。