1 回答
TA贡献1946条经验 获得超4个赞
PHP将代码与 HTML 混合在一起会造成大混乱。但 Flask 试图将其分开。
在渲染模板之前检查文件是否存在于代码中并仅将结果发送到模板 - 即。
return render_string(...., file_exist=os.path.isfile('file.txt'))
并在模板中
{% if file_exist %}
编辑:
通常文件位于子文件夹中,您应该使用
os.path.isfile('subfolder/file.txt')
甚至
os.path.isfile('/full/path/to/file.txt')
编辑:
问题比较复杂。服务器需要更长的时间在单独的线程中创建文件,因此当服务器检查时该文件还不存在isfile()。它需要 JavaScript 和 AJAX,它将定期向其他功能(即/check)发送请求,并且它会True从.Falseisfile()
使用纯 JavaScript 的最小工作示例,XMLHttpRequest但您可以尝试fetch()使用库来编写它jQuery
from flask import Flask, render_template_string
import threading
import time
import os
# delete only for test code
#if os.path.isfile('file.txt'):
# os.unlink("file.txt")
class ExportingThread(threading.Thread):
def run(self):
time.sleep(5)
file = open("file.txt", "w")
file.close()
app = Flask(__name__)
app.debug = True
@app.route('/')
def index():
exporting_threads = ExportingThread()
exporting_threads.start()
return render_template_string('''<!DOCTYPE html>
<html>
<head>
<style>
.hidden {display:none;}
</style>
</head>
<body>
<button id="button" type="submit" class="hidden" onclick="window.open('file.doc')">Download!</button>
<script>
// ask server if file exists
function check() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
if(this.responseText == 'True') {
// show button
document.getElementById("button").classList.remove("hidden");
// stop checking
clearTimeout(timer);
}
}
};
xhttp.open("GET", "/check", true);
xhttp.send();
}
// repeate function `check` every 1000ms (1s)
var timer = setInterval(check, 1000);
</script>
</body>
</html>''')
@app.route('/check')
def check():
return str(os.path.isfile('file.txt'))
if __name__ == '__main__':
app.run()
添加回答
举报