如何让Flask应用程序每5分钟运行一次?

Col*_*des 6 python flask python-3.x

我有一个可以按照我想要的方式工作的应用程序,但现在我希望它每 5 分钟从一些虚拟机获取实时数据。在下面的代码中,我将其设置为每十秒更新一次,只是为了看看它是否有效,但什么也没有发生。我正在使用 time.sleep。我还缺少什么?

import time
from flask import Flask, render_template
from testapi import grab_cpu

app = Flask(__name__)

starttime = time.time()
while True:

    machines =["build05", "build06", "build07","build08", "build09", "build10", "build11", "build12","build14","build15", "winbuild10","winbuild11", "winbuild12", "winbuild13", "wbuild14", "wbuild15", "winbuild16", "winbuild17", "winbuild18"] 

    cpu_percentage =[grab_cpu("build05"), grab_cpu("build06"),grab_cpu("build07"),  
            grab_cpu("build08"), grab_cpu("build09"), grab_cpu("build10"), grab_cpu("build11"), grab_cpu("build12"), grab_cpu("build13"), grab_cpu("build14"), grab_cpu("build15"), grab_cpu("winbuild10"), grab_cpu("winbuild11"), grab_cpu("winbuild12"), grab_cpu("winbuild14"), grab_cpu("winbuild15"), grab_cpu("winbuild16"), grab_cpu("winbuild17"), grab_cpu("winbuild18")] 

    @app.route("/")  # this sets the route to this page
    def home():
        return render_template('testdoc.html', len = len(machines), machines = machines, cpu_percentage = cpu_percentage)

    app.run(use_reloader = True, debug = True) 
    time.sleep(10.0 - ((time.time() - starttime) % 10.0))
Run Code Online (Sandbox Code Playgroud)

编辑(这是一个带有建议的更新,它仍然无法按照我的意愿工作):编辑2个更多信息:我有一个带有函数grab_cpu的文件,它对虚拟机进行api调用并返回使用百分比。我有另一个名为 test doc.html 的文件,它只显示 html。从这些回复中,我猜我需要使用一些 javascript 和带有套接字的东西。有人可以留下一个链接来为我指明正确的方向吗?

import time
from flask import Flask, render_template
from testapi import grab_cpu

app = Flask(__name__)



@app.route("/")  # this sets the route to this page
def home():
    starttime = time.time()

    while True:
        machines =["build05", "build06", "build07","build08", "build09", "build10", "build11", "build12","build14","build15", "winbuild10","winbuild11", "winbuild12", "winbuild13", "wbuild14", "wbuild15", "winbuild16", "winbuild17", "winbuild18"] 

        cpu_percentage =[grab_cpu("build05"), grab_cpu("build06"),grab_cpu("build07"),  
            grab_cpu("build08"), grab_cpu("build09"), grab_cpu("build10"), grab_cpu("build11"), grab_cpu("build12"), grab_cpu("build13"), grab_cpu("build14"), grab_cpu("build15"), grab_cpu("winbuild10"), grab_cpu("winbuild11"), grab_cpu("winbuild12"), grab_cpu("winbuild14"), grab_cpu("winbuild15"), grab_cpu("winbuild16"), grab_cpu("winbuild17"), grab_cpu("winbuild18")] 
        return render_template('testdoc.html', len = len(machines), machines = machines, cpu_percentage = cpu_percentage)
        time.sleep(10.0 - ((time.time() - starttime) % 10.0))
app.run(use_reloader = True, debug = True) 
    
Run Code Online (Sandbox Code Playgroud)

这是页面: 网站图片

谢谢。

mtl*_*nch 3

我建议不要使用 Flask 来处理调度。Flask 请求的预期流程是:

  1. 接收来自浏览器的 HTTP 请求
  2. 尽快生成响应(理想情况下在几毫秒内,但几乎总是少于几秒)
  3. 将响应返回给浏览器

上面代码的意图似乎是使用 Flask 将更新送到浏览器,但是 Flask 只能响应传入的请求,而不能强制浏览器进行更改。

对于您描述的用例,更简单的解决方案是处理浏览器中的刷新逻辑。

对于一个非常基本的示例,请将其放入您的testdoc.html模板中:

<script type="text/javascript">
    setTimeout(function () { 
      location.reload();
    }, 10 * 1000);
</script>
Run Code Online (Sandbox Code Playgroud)

这将每 10 秒重新加载页面,这将生成一个新的请求到您的 Flask 服务器并在您的浏览器中显示更新的信息。

如果您想要更高级并避免重新加载整个页面,您可以使用 JavaScript XmlHttpRequests或更现代的Fetch API来异步更新页面的特定元素。

另外,以下是 Python 代码的建议简化:

from flask import Flask, render_template
from testapi import grab_cpu

app = Flask(__name__)

build_machines = list(map(lambda i: 'build%02d' % i, range(5, 16)))
win_build_machines = list(map(lambda i: 'winbuild%02d' % i, range(10, 19)))
machines = build_machines + win_build_machines

# Handle HTTP GET requests to / route
@app.route("/", methods=['GET'])
def home():
        cpu_percentage = list(map(lambda b: grab_cpu(b), machines))
        return render_template('testdoc.html', len = len(machines), machines = machines, cpu_percentage = cpu_percentage)

app.run(use_reloader = True, debug = True) 
    
Run Code Online (Sandbox Code Playgroud)