gpt4 book ai didi

python - 如何使用 Flask 显示 html 然后重定向到下载

转载 作者:太空宇宙 更新时间:2023-11-03 20:09:48 29 4
gpt4 key购买 nike

我对 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

当我运行上面的代码时,我收到此错误:

运行时错误:在应用程序上下文之外工作。

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

但是,我真的不知道自己在做什么,这可能是完全错误的处理方法。任何帮助将不胜感激。

最佳答案

您想要做的事情不应该在直接向服务器发出 API 请求中完成。创建存档可能需要一些时间,通常最好直接响应您收到的请求并启动后台任务来执行较长的操作。

一旦较长的操作成功,您可以向客户端发送一条消息,告诉他存档已准备好供他下载。

实现建议:

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

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

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

瞧,你应该可以走了。

关于python - 如何使用 Flask 显示 html 然后重定向到下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775926/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com