我正在使用Flask构建一个Web应用程序,其中多个路由和模板使用需要大量计算的相同功能。因此,应用程序最终会多次重复这些繁重的计算。以下是简化代码:
from flask import Flask, render_template, request, session, url_for, Markup, send_from_directory
from AnotherModule import perform_heavy_calculations, convert_dataframe
@application.route('/<string:keyword>', methods=['GET'])
def index(keyword):
dataframe = perform_heavy_calculations (keyword)
session['keyword'] = keyword
return render_template ("index.html", dataframe = dataframe)
@application.route("/timeseries.json", methods=['GET'])
def timeseries (keyword):
keyword = session.get ('keyword')
dataframe = perform_heavy_calculations (keyword)
timeseries = convert_dataframe (dataframe)
return render_template ("timeseries.html", timeseries = timeseries)
if __name__ == '__main__':
application.run(debug=True, threaded=True)
如您所见,函数perform_heavy_calculations(keyword)重复两次 - 每次路由一次。这使得应用程序非常慢。在这种情况下,如果执行此功能一次,并且结果在两个不同的路径中使用,并且渲染不同的模板,则慢两倍。 由于数据帧太大,我无法在会话中传递结果。 此外,我无法在路线之外执行此功能,因为参数(关键字)将仅通过在&#39; /&#39;中提交的获取请求来传递。路线。
避免两次执行该功能的最佳方法是什么,但只在结果用于两个不同的模板时执行一次?
谢谢,
安东
答案 0 :(得分:0)
在您的情况下,我建议您为perform_heavy_calculations()
功能添加缓存支持。查看Flask-Caching。
答案 1 :(得分:0)
我使用缓存与会话,因为它允许存储不同用户和不同关键字的结果。下面是我使用的简化代码。
dataframe = cache.get(keyword)
if dataframe is None:
dataframe = perform_heavy_calculations (keyword)
cache.set(keyword, dataframe, timeout=60 * 60)
这可用于多个视图和功能 非常感谢您的帮助!
安东