6

高価な関数の結果であるオブジェクトを保存したい。高価な関数は、リクエストの前に1回だけ処理する必要があります。

私はFlaskのドキュメントを確認しg、結果を保存することを検討しまし@app.before_first_requestた。この割り当てを定義するためのデコレータは1回だけ発生しました。

私のコードは次のようなものです:

@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リクエストが最初に呼び出されたときにのみ機能します。2回目に「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

キャッシングは一般的にそれを行う方法です。ただし、1回限りの値があり、何らかの理由でキャッシュインフラストラクチャを導入したくない場合(値がタイムアウトしない場合)、アプリの起動時にモジュールグローバルとして計算し、使用したり、インポートしたりすることもできます。必要に応じて。

テンプレートで値が必要な場合:

  • コンテキストプロセッサを介してテンプレートに追加します。
  • アプリの初期化の前に、それを構成モジュールに追加します。
于 2017-07-09T21:00:14.070 に答える