21

私が作成した数十個のカスタム フィルターを含む jinja_filters.py ファイルがあります。現在、これらのフィルターを使用する必要がある複数の Flask アプリがあります。(私の問題がFlask固有のものかどうかはわかりません。)

私がやりたいことを達成するためのハッキーな方法の1つは、次のことです。

app = Flask(__name__)

import jinja_filters

@app.template_filter('filter_name1')
def filter_name1(arg):
    return jinja_filters.filter_name1(arg)

@app.template_filter('filter_name2')
def filter_name2(arg):
    return jinja_filters.filter_name2(arg)

...

これを行う「正しい」方法は何ですか?

編集: 理想的には、各フィルター名をリストする必要はありません。したがって、新しいフィルターを jinja_filters.py に追加するときに、他のコードを更新する必要はありません。すべてのアプリですぐに使用できるようになります。

4

2 に答える 2

32

アプリ オブジェクト (おそらく app.py) を設定する場所では、カスタム フィルターをインポートしてから、Jinja 環境属性を変更するだけで済みます。

import jinja_filters

app = Flask(__name__)
app.jinja_env.filters['filter_name1'] = jinja_filters.filter_name1
app.jinja_env.filters['filter_name2'] = jinja_filters.filter_name2

等々。

別の可能性は、inspectモジュールを使用してすべてのメソッドを次のjinja_filtersように見つけることです。

from inspect import getmembers, isfunction
import jinja_filters

app = Flask(__name__)

my_filters = {name: function 
                for name, function in getmembers(jinja_filters)
                if isfunction(function)}

app.jinja_env.filters.update(my_filters)

このコードはテストされていませんが、ファイルに存在する関数名と関数のディクショナリを作成しjinja_filters、Jinja 環境のフィルタ ディクショナリをフィルタで更新するという考え方です。

于 2012-09-05T20:57:19.700 に答える