如何构造在Flask中使用相同功能的多个路径和渲染模板

时间:2018-05-30 20:46:14

标签: python flask

我正在使用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;中提交的获取请求来传递。路线。

避免两次执行该功能的最佳方法是什么,但只在结果用于两个不同的模板时执行一次?

谢谢,

安东

2 个答案:

答案 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)

这可用于多个视图和功能 非常感谢您的帮助!

安东