2017-05-13 12 views
0

私は現在、FlaskとFlask-User拡張を使用して認可を処理するWebアプリケーションを開発中です。私のテンプレートでFlask - グローバル値を正しく設定する方法

{% if current_user.is_authenticated and current_user.has_roles('Admin') %} 

:このような私のviews.pyファイルと何かに

@application.route('/dummy') 
@roles_required('Admin') 
@login_required 
def dummy(): 

:現時点では私はこのような何かを持っています。

ここで、私はロール名の点で自分の考えを変えてから、そのプロジェクトを検索して置き換える必要がありました。私はADMIN_ROLEのようなものを定義して、views.pyやその他のテンプレートの中でアクセスできるようにしたかったのです。私はちょうど私が役割の名前を変更したいときはいつでも設定ファイルを変更したいと思います。

私は私のconfig.pyADMIN_ROLE = "Admin"を設定し、@roles_required(current_app.config['ADMIN_ROLE'])を書いを使用してみましたが、それは私に次のエラー得られますので、それは間違っている必要があります

 
RuntimeError: Working outside of application context. 

This typically means that you attempted to use functionality that needed 
to interface with the current application object in a way. To solve 
this set up an application context with app.app_context(). See the 
documentation for more information. 

を。私がしようとしていることを達成する最も正しい方法は何でしょうか?

答えて

0

このように、アプリコンテキスト内からはconfigにしかアクセスできません。通常は、あなたがこれを行う:あなたはデコレータでこれをやっているので

with current_app.app_context(): 
    admin_role = current_app.config['ADMIN_ROLE'] 

、私はそれを行うために、とにかくそこだとは思いません。私はちょうど別のモジュールを使用することをお勧めします。さて、doesn't appearでは、ジンジャーでpython import文を使用できるので、それでもapp.configを使用します。基本的には、必要な役割を持つモジュールを作成し、それを設定ファイルとルートファイルにインポートします。

roles.py

ADMIN = "Admin" 
USER = "User" 

from roles import ADMIN, USER 

@application.route('/dummy') 
@roles_required(ADMIN) 
@login_required 
def dummy(): 

views.py

{% if current_user.is_authenticated and current_user.has_roles(app.config['ADMIN_ROLE']) %} 
+0

感謝

from roles import ADMIN, USER ADMIN_ROLE = ADMIN USER_ROLE = USER 

routes.py config.pyあなた、それは素晴らしい答えです。 これはジンジャで 'app.config'を使用する必要があるにもかかわらず、最も論理的な方法であり、クリーンなソリューションのようです。あなたは私が達成しようとしていることがどこの役割の文字列名を書いているよりも優れていることに同意しますか? –

+0

はい、変更可能なコード内に何かがある場合は、複数ではなく1か所で変更することをお勧めします。 –

+0

私は小さな問題に遭遇しました。 Jinjaでjavascriptを使用する場合、 'if($(this)).val()!== {{config ['ADMIN_ROLE']}})'これは 'if($(this) ADMINはconfig.pyでインポートされた変数の名前で、 '' Admin ''の値ではありません。 –

関連する問題