定期重启 Flask App 以获取最新数据并刷新多个 Python 变量?

Restart Flask App periodically to get most recent data and refresh multiple Python variables?

我有一个 Flask 应用程序,它使用 SQL 请求从 Oracle 数据库获取数据。该数据库很少更新,所以我的想法是从数据库中获取这些数据并在应用程序加载时对这些数据执行许多操作。然后网页速度很快,因为我没有再发SQL请求,也不怕SQL注入。但是,我确实需要大约每天更新一次数据。

下面是代码的最小可验证示例,它没有使用 SQL,但它仍然可以证明原理。

在我的真实代码中,df 来自数据库,但我从中创建了多个变量,这些变量使用 flask 传递到网页中。我怎样才能刷新这些?

我试过了

How to re-run my python flask application every night?

但服务器从未刷新,即使我将调试模式设置为 False。它不起作用的原因是一旦 flask 应用程序 运行 它就好像它在它自己的 while 循环中为应用程序服务。我第一次按 ctrl+c 它退出应用程序服务器并再次启动 while 循环,重新启动服务器,但这没有帮助。

from flask import Flask, render_template, redirect, url_for, Response
import pandas as pd
import datetime as dt  
import flask


#####################################################################
#start of part that I need to refresh

df= pd.DataFrame(range(5),columns=['Column1'])
df['Column2'] = df['Column1']*2
df['Column3'] =dt.datetime.now()
df['Column4'] = df['Column3'] + pd.to_timedelta(df['Column2'],'d')

var1=min(df['Column4'])
var2=max(df['Column4'])

#End of Refresh
####################################################################

app = flask.Flask(__name__, static_url_path='',
            static_folder='static',
            template_folder='template')
app.config["DEBUG"] = True

@app.route("/home")
def home():
return render_template("home.html",
                       var1=str(var1),
                       var2=str(var2)) 
if __name__ == '__main__':
    app.run(host="localhost", port=5000, debug=True)

首页HTML

'''
<HTML>
    <body>
        <div>This is Var1: {{var1}} </div>
        <div>This is Var2: {{var2}} </div>
    
    </body>
</HTML>
'''

我想制作一个每 5 分钟刷新一次的工作示例作为概念验证。

根据您提供的代码,您要刷新的部分只会在您的主进程启动时运行一次。你可以在你的 flask 服务器之外有一个 cron 作业来重新启动它,但是如果有人在服务器重新启动时尝试查询,这将导致停机。

一个更好的解决方案是将此查询和数据操作添加到一个函数中,并在每次有人尝试访问该页面时调用它。这样,您可以设置一个缓存,它会查询一次数据并将它们保存在内存中。您还可以选择指定要将数据缓存多长时间,它会自动删除数据,直到下次有人请求它们为止。

from cachetools import TTLCache

# Cache the results with a time to live cache. A cached entry will get deleted
# after 300s 
TTLCache(maxsize=200, ttl=300)
def get_data():
    
    #####################################################################
    #start of part that I need to refresh

    df= pd.DataFrame(range(5),columns=['Column1'])
    df['Column2'] = df['Column1']*2
    df['Column3'] =dt.datetime.now()
    df['Column4'] = df['Column3'] + pd.to_timedelta(df['Column2'],'d')

    var1=min(df['Column4'])
    var2=max(df['Column4'])

    #End of Refresh
    ####################################################################
    return var1, var2

现在您可以调用此函数,但只有在结果尚未保存在缓存中时才会执行。

@app.route("/home")
def home():
    var1, var2 = get_data()
    return render_template("home.html",
                   var1=str(var1),
                   var2=str(var2)) 

此解决方案的另一个优点是,您始终可以在更新数据后完全清除缓存。