我有一個flask 應用程式,它使用SQL 請求從oracle 資料庫中獲取資料。該資料庫很少更新,所以我的想法是從資料庫中獲取這些資料并在應用程式加載時對這些資料執行許多操作。然后網頁非常快,因為我沒有再次發出SQL請求,我也不怕SQL注入。但是,我確實需要每天更新一次資料。
下面是代碼的最小可驗證示例,它不使用 SQL,但仍然可以演示原理。
在我的真實代碼中 df 來自資料庫,但我從中創建了多個變數,這些變數使用 Flask 傳遞到網頁中。我怎樣才能重繪 這些?
我試過這個
如何每晚重新運行我的 python Flask 應用程式?
但是服務器從未重繪 ,即使我將除錯模式設定為 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 分鐘重繪 一次的作業示例作為概念證明。
uj5u.com熱心網友回復:
根據您提供的代碼,您要重繪 的部分只會在主行程啟動時運行一次。您可以在燒瓶服務器之外有一個 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))
此解決方案的另一個優點是,您可以在更新資料后始終完全清除快取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/361290.html
上一篇:在Content-Type:multipart/form-data的情況下,如何一次從Flask請求物件中獲取多個影像?
