web-dev-qa-db-ja.com

Python-デコレータで元の関数の引数を取得する

WSGI + Werkzeugアプリケーションのビュー用に「login_required」デコレータを作成しようとしています。

これを行うには、ビューメソッドに渡されるRequestオブジェクトを介してアクセスできるユーザーのセッションにアクセスする必要があります。

ただし、デコレータでそのRequestのインスタンスを取得する方法がわかりません。私はPEP318、特に4番目の例を見ましたが、完全には理解できていません。

これが私が試していることです:

def login_required(*args, **kw):
    def goto_login(**kw):
        return redirect(url_for('login'))

    def decorate(f):
        # args[0] should be request
        args[0].client_session['test'] = True
        logged_in = 0
        if logged_in:
            return f
        else:
            return goto_login
    return decorate


@login_required()
@expose('/hello/<string:name>')
def hello(request, name):
    return render_template('say_hello.html', name=name)

しかし、args[0]を呼び出そうとするとインデックスが範囲外のエラーになります。

「login_required」デコレータの「hello」関数に渡されたリクエスト引数にアクセスする方法はありますか?

29
ashgromnies

デコレータlogin_requiredには関数(この場合はhello)が渡されます。

だからあなたがしたいことは:

def login_required(f):
    # This function is what we "replace" hello with
    def wrapper(*args, **kw):
        args[0].client_session['test'] = True
        logged_in = 0
        if logged_in:
            return f(*args, **kw)  # Call hello
        else:
            return redirect(url_for('login'))
    return wrapper
39
brian-brazil

kwargsは、引数をキーとして、値を値として含む辞書です。

だからあなたがする必要があるのはチェックすることだけです:some_var = kw['my_property']

3
mafonya