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

我正在使用具有以下路线的 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()实际上并未被执行,但它仍然允许我下载文件。


RISEBY
浏览 66回答 2
2回答

繁华开满天机

这个问题很可能是由 Flask 内置的缓存引起的。这设置了Cache-Control标头,并适用于 Flask 提供的静态文件,也适用于send_file和send_from_directory函数。这可以解释文件下载的行为,但打印语句未运行。事实上,该请求甚至不会到达服务器。您可以在开发工具的网络选项卡上直观地看到这一点:您可以通过在应用程序上设置以下配置变量来禁用此功能:app.config['SEND_FILE_MAX_AGE_DEFAULT'] = -1该-1值禁用缓存。您可能必须实际清除浏览器缓存才能使此设置生效,或者更改端点的 URL /download,尽管这很不方便。设置后请注意差异:

吃鸡游戏

我假设您希望打印语句显示在 HTML 中。如果这不是您想要的,我深表歉意。首先, print 在您的示例中所做的是在服务器上输出文本,因此文本永远不会发送到您的 HTML。要将消息发送到 HTML,您可以flash从 Flask 导入。该flash函数将向您的 HTML 发送一条消息,您可以在其中接收带有get_flashed_messages().例子下面我们做几件事。相反print,我们使用flash. 传递给的第一个参数flash是消息。("certificate printed"或os.getcwd()) 第二个参数是消息的类别。( "download_file")请注意,类别可以是完全任意的,只要模板中使用相同的类别即可。HTML 中的链接下方。我们调用get_flashed_messages它并将其分配给一个变量download_msgs。在这种情况下唯一的论据是category_filter=["download_file"]。这将获取我们之前发送的所有消息flash,并仅保留具有该"download_file"类别的消息。我们使用 来检查消息{% if download_msgs %},使用 来循环消息{% for message in download_msgs %},并显示每条消息。烧瓶:from flask import Flask, flash, send_fileapp = 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Html5