2016-04-01 18 views
0

Flask-LoginをLDAPルックアップに基づいて認証する方法を知りました。今度は、ユーザーにの両方がログインしている場合にのみ、特定のエンドポイントへのアクセスを許可して、適切なグループに所属していることを確認します。Flask-Loginエンドポイントでデコレータが壊れているのはなぜですか?

私は、これはそれを行うための正しい方法であるかどうかわからないんだけど、私は、私はちょうどエンドポイントに装飾を追加することができると思った。(今のところ)

@app.route('/top_secret') 
@authorize 
@login_required 
def top_secret(): 
    return render_template("top_secret.html") 

と完全にパススルーしますデコレータ:

def authorize(func): 
    def newfunc(*args, **kwargs): 
     return func(*args, **kwargs) 
    return newfunc 

しかし、これはエラーになります実行している:

werkzeug.routing.BuildError: Could not build url for endpoint 'top_secret'. 

@aせずにそれを実行しながら、飾る人にはうまく働きます。

私はどこが間違っていたのか分かりません。この方法でエンドポイントを飾ることはできませんか?もしそうでなければ、承認ステップはどこで行われるべきですか? (それは@login_requiredが何をする必要があるのか​​完了した後に行わなければならないでしょう)

答えて

3

ああ、そう、超簡単!ラップで一度

print(top_secret) 

、とせずに一度:あなたがwrapsを必要とする理由、あなたがこれを行うことができます理解する

from functools import wraps 


def authorize(func): 
    @wraps(func) 
    def newfunc(*args, **kwargs): 
     return func(*args, **kwargs) 
    return newfunc 

。あなたが参照してくださいよ、それがなければ

<function top_secret at 0x7ff165150840> 

:ラップを使用すると、このようなものが表示されます

<function authorize.<locals>.newfunc at 0x7f81b8456840> 

documentation for wrapsは本当に良いですが、基本的にはデフォルトで機能をラップするとき、あなたが失いますドキュメントストリング、および属性、およびすべての残りの部分です。だから、ファンクションのためにapp.routeデコレーションを失うので、FlaskはURLの構築方法を理解できません。

デコレータをwrapsに追加すると、app.routeが行ったすべてのものが復元され、Flaskはルートを作成できます。

+0

これだけです!多くのありがとう、ウェイン。 –

+0

ウェイン、私はあなたが瞬間がある場合、フォローアップの質問があります。 http://stackoverflow.com/questions/36366799/flask-login-breaks-when-my-decorator-accepts-parameters –

関連する問題