2 回答
TA贡献1816条经验 获得超4个赞
这个问题很可能是由 Flask 内置的缓存引起的。这设置了Cache-Control
标头,并适用于 Flask 提供的静态文件,也适用于send_file
和send_from_directory
函数。
这可以解释文件下载的行为,但打印语句未运行。事实上,该请求甚至不会到达服务器。
您可以在开发工具的网络选项卡上直观地看到这一点:
您可以通过在应用程序上设置以下配置变量来禁用此功能:
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = -1
该-1
值禁用缓存。
您可能必须实际清除浏览器缓存才能使此设置生效,或者更改端点的 URL /download
,尽管这很不方便。
设置后请注意差异:
TA贡献1829条经验 获得超7个赞
我假设您希望打印语句显示在 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_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 代码,您可以使用
flash
Flask 应用程序中的函数。要从 Flask 应用程序接收消息到 HTML 代码,您可以
get_flashed_messages
在 HTML 代码中使用该函数。您可以使用类别来区分闪现的消息。在您的烧瓶应用程序中使用第二个参数
flash
。在 HTML 代码中使用Category_filter关键字参数。get_flashed_messages
- 2 回答
- 0 关注
- 118 浏览
添加回答
举报