为了账号安全,请及时绑定邮箱和手机立即绑定

在返回“send_file”的烧瓶函数中,代码似乎不会在后续请求上运行,但文件仍然会下载。为什么?

在返回“send_file”的烧瓶函数中,代码似乎不会在后续请求上运行,但文件仍然会下载。为什么?

RISEBY 2023-11-13 10:44:42
我正在使用具有以下路线的 Flask 代码:@app.route('/download')def download_file():    path = "certificate.docx"    print("certificate printed")    print(os.getcwd())    return send_file(path, as_attachment=True)HTML 代码:<p><a href="{{ url_for('.download_file') }}">Download</a></p>执行这段代码是为了下载名为certificate.docx.问题是函数内的打印语句download_file()实际上并未被执行,但它仍然允许我下载文件。
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

这个问题很可能是由 Flask 内置的缓存引起的。这设置了Cache-Control标头,并适用于 Flask 提供的静态文件,也适用于send_filesend_from_directory函数。

这可以解释文件下载的行为,但打印语句未运行。事实上,该请求甚至不会到达服务器。

您可以在开发工具的网络选项卡上直观地看到这一点:

https://img1.sycdn.imooc.com/65518db700017bf006560235.jpg

您可以通过在应用程序上设置以下配置变量来禁用此功能:

app.config['SEND_FILE_MAX_AGE_DEFAULT'] = -1

-1值禁用缓存。

您可能必须实际清除浏览器缓存才能使此设置生效,或者更改端点的 URL /download,尽管这很不方便。

设置后请注意差异:

https://img1.sycdn.imooc.com/65518dc30001781a06550230.jpg

查看完整回答
反对 回复 2023-11-13
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

我假设您希望打印语句显示在 HTML 中。如果这不是您想要的,我深表歉意。

首先, print 在您的示例中所做的是在服务器上输出文本,因此文本永远不会发送到您的 HTML。

要将消息发送到 HTML,您可以flash从 Flask 导入。该flash函数将向您的 HTML 发送一条消息,您可以在其中接收带有get_flashed_messages().

例子

下面我们做几件事。

  1. 相反print,我们使用flash. 传递给的第一个参数flash是消息。("certificate printed"os.getcwd()) 第二个参数是消息的类别。( "download_file")请注意,类别可以是完全任意的,只要模板中使用相同的类别即可。

  2. HTML 中的链接下方。我们调用get_flashed_messages它并将其分配给一个变量download_msgs。在这种情况下唯一的论据是category_filter=["download_file"]。这将获取我们之前发送的所有消息flash,并仅保留具有该"download_file"类别的消息。

  3. 我们使用 来检查消息{% if download_msgs %},使用 来循环消息{% for message in download_msgs %},并显示每条消息。

烧瓶:

from flask import Flask, flash, send_file


app = Flask(__name__)


@app.route('/download')

def download_file():

    path = "certificate.docx"

    flash("certificate printed", "download_file")

    flash(os.getcwd(), "download_file")

    return send_file(path, as_attachment=True)

HTML:


<p>

  <a href="{{ url_for('.download_file') }}">Download</a>


  {% with download_msgs = get_flashed_messages(category_filter=["download_file"]) %}

    {% if download_msgs %}

      <ul class=flashes>

      {% for message in download_msgs %}

        <li>{{ message }}</li>

      {% endfor %}

      </ul>

    {% endif %}

  {% endwith %}

</p>

这个例子很粗糙,但我希望它能回答你的问题

概括

  • 要将消息从 Flask 应用程序发送到 HTML 代码,您可以使用flashFlask 应用程序中的函数。

  • 要从 Flask 应用程序接收消息到 HTML 代码,您可以get_flashed_messages在 HTML 代码中使用该函数。

  • 您可以使用类别来区分闪现的消息。在您的烧瓶应用程序中使用第二个参数flash。在 HTML 代码中使用Category_filter关键字参数。get_flashed_messages


查看完整回答
反对 回复 2023-11-13
  • 2 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信