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

服务器上不存在文件时不显示按钮 - 使用 Flask

服务器上不存在文件时不显示按钮 - 使用 Flask

小怪兽爱吃肉 2023-07-27 16:47:10
是否可以仅在我的 Flask 应用程序创建文件后才显示下载按钮?使用 PHP,它可能是这样的:<style>.hidden{ display:none;}</style><?phpif(!file_exists("path") ){ $class = "hidden" }  echo "<button type=\"submit\" onclick=\"window.open(\'file.txt\')\">Download!</button>";?>我尝试直接在 HTML 文件中使用 Python 代码:{% if os.path.isfile('file.txt') %}    <button type="submit" onclick="window.open('file.txt')">Download!</button>{% else %}    <button type="submit" class="hidden" onclick="window.open('file.doc')">Download!</button>{% endif %}但出现错误:jinja2.exceptions.UndefinedError: 'os' is undefined更新@furas 回复后的完整代码。代码应该做什么:创建一个新线程,该线程将写入文件。模板已呈现,并带有隐藏的下载按钮。文件已创建下载按钮自动可见 - 因为现在文件存在。然而,在下面的代码中,该按钮在文件写入后保持隐藏状态。仅当创建文件后重新加载页面时,该按钮才会显示。app.pyfrom flask import Flask, render_templateimport threadingimport timeimport osglobal exporting_threadsclass ExportingThread(threading.Thread):    def run(self):        time.sleep(1)                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('index.html', file_exist = os.path.isfile('file.txt'))if __name__ == '__main__':    app.run()index.html,位于“templates”文件夹内。<!DOCTYPE html><html><head>    <style>    .hidden{ display:none;}    </style></head><body>    {% if file_exist %}        <button type="submit" onclick="window.open('file.doc')">Download!</button>    {% else %}        <button type="submit" class="hidden" onclick="window.open('file.doc')">Download!</button>    {% endif %}</body></html>
查看完整描述

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()



查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

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