2012-09-05 8 views
16

jinja_filters.pyファイルには、私が書いた数十種類のカスタムフィルタがあります。今私は、これらのフィルタを使用する必要がある複数のFlaskアプリケーションがあります。 (私は私の問題をフラスコに固有であるかどうかはわからない。)別のファイルからカスタムjinja2フィルタをインポートする方法(およびFlaskを使用する方法)

私が欲しいものを達成するための一つのハックの方法が行うことです。

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) 

... 

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

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

答えて

25

appオブジェクト(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 

などとなる。

別の可能性はそうのようなjinja_filters内のすべてのメソッドを見つけるためにinspectモジュールを使用することです:

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環境のフィルタ辞書をフィルタで更新します。

+0

これは明らかに私が持っているものより優れています。しかし、各フィルター名を明示的にリストする必要はありませんか? –

+0

私は、 'inspect'モジュールを使ってフィルタを動的に追加できる別の解決策で自分の答えを更新しました。 – aezell

+1

まあ、仕事は大丈夫です:)しかし、私はまだJinja2/Flaskの著者がこれを行うためのより簡潔な方法を持っていなかったとは信じられません。 (他の誰もチャイムインしていなければ、私は数日後にあなたの答えにチェックをつけます) –

28

Flask blueprintsを使用してこれを行う推奨方法があります。それだユースケースの一つは、特にこの機能は次のとおりです。

  • は青写真を通じてテンプレートフィルター、静的ファイル、テンプレート、およびその他のユーティリティを提供します。青写真は、アプリケーションやビュー機能を実装する必要はありません。

あなただけflask.Blueprintオブジェクトを作成し、Blueprint.app_template_filterデコレータやBlueprint.add_app_template_filter方法を使用して、あなたはflask.Flask Appオブジェクトと同じように、同様の方法で、あなたのフィルタを登録するためにそれを使用する必要があります。

# filters.py 

import jinja2 
import flask 

blueprint = flask.Blueprint('filters', __name__) 

# using the decorator 
@jinja2.contextfilter 
@blueprint.app_template_filter() 
def filter1(context, value): 
    return 1 

# using the method 
@jinja2.contextfilter 
def filter2(context, value): 
    return 2 

blueprint.add_app_template_filter(filter2) 

次に、あなただけのアプリのオブジェクトに青写真を登録する必要があります。

# app.py 

import flask 
import filters 

app = flask.Flask(__name__) 
app.register_blueprint(filters.blueprint) 

出来上がり、フィルタが登録されています。

関連する問題