6

我想保存一个对象,它是昂贵函数的结果。昂贵的功能只应在任何请求之前处理一次。

我检查了 Flask 的文档并考虑g保存结果和@app.before_first_request装饰器来定义这个分配只发生一次。

我的代码是这样的:

@app.before_first_request
def before_first_request():
    g.rec = take_long_time_to_do()

@app.route('/test/')
def test():
    return render_template('index.html',var_rec=g.rec)

但是,这些代码无法正常工作。它仅在第一次test调用请求时起作用。当我第二次访问“myapplication/test”时,g.rec不存在,这将引发异常

有没有人知道如何g在启动应用程序时分配一个全局变量?

4

3 回答 3

5

g只是该请求的全局对象。您是否考虑过使用缓存机制?

> pip search flask | grep "cache" | sort
Flask-Cache               - Adds cache support to your Flask application
Flask-Cache-PyLibMC       - PyLibMC cache for Flask-Cache, supports multiple operations
Flask-Memsessions         - A simple extension to drop in memcached session support for Flask.

然后你可以存储那里的结果take_long_time_to_do()并在它存在时检索它。

于 2013-01-04T06:52:31.823 回答
0

您可以尝试将该函数调用放入__init__.py您的项目包中吗?我通常__init__.py用来初始化app = Flask(__name__)等。所以可以说你可以尝试以下方法:

# __init__.py:

from flask import Flask
from somemodule import take_long_time_to_do
app = Flask(__name__)
rec = take_long_time_to_do()

然后,您可以rec在任何视图中使用该变量,只要您导入它:

# views.py

from myproject import rec
@app.route('/test/')
def test():
    return render_template('index.html',var_rec=rec)
于 2013-01-04T15:16:15.917 回答
0

缓存是通常的方法。但是假设您有一个一次性值并且由于某种原因不想引入缓存基础架构(值不会超时),您也可以在应用程序启动时将其计算为全局模块,使用它和/或导入它在需要的地方。

如果模板中需要该值:

于 2017-07-09T21:00:14.070 回答