2013-01-04 37 views
3

我想保存一個對象,這是一個昂貴函數的結果。 昂貴的功能只能在任何請求前處理一次。在Flask中爲應用程序分配一個變量`g`一次並且僅一次

我檢查了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 /測試」第二次,g.rec不存在,這將拋出一個異常

有沒有人有關於如何INITING應用程序時的全局變量分配到g想法?

回答

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()其結果存在,如果它存在檢索。

+0

謝謝,sberry。我可以在該應用程序中使用全局不可變對象嗎?爲什麼我應該使用'catching'而不是全局對象? –

+0

同意 - ['Flask-Cache'](http://packages.python.org/Flask-Cache/)非常強大,你可以緩存到內存/文件/ redis並設置超時等。 –

+0

看看[緩存其他函數](http://packages.python.org/Flask-Cache/#caching-other-functions)示例 –

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) 
0

緩存是一般做這件事的方法。但是假設你有一次性價值,並且不想因爲某種原因引入緩存基礎設施(值不超時),你也可以在應用程序啓動時將其作爲全局模塊進行計算,使用它和/或導入它在需要的地方。

如果需要在模板中值:

  • 它通過context processor添加到模板。
  • 在應用程序初始化之前將它添加到配置模塊。
相關問題