Python - Get original Funktionsargumente in Dekorateur
Frage
Ich versuche, einen "login_required" Dekorateur für die Ansichten in einer WSGI + Werkzeug-Anwendung zu schreiben.
Um dies zu tun, muss ich an die Sitzung des Benutzers erhalten, die über das Request-Objekt zugänglich ist, die in die Ansicht Methoden übergeben wird.
Ich kann nicht herausfinden, wie in diesem Fall des Antrags in der Dekorateur zu bekommen, though. Ich sah PEP318, insbesondere das vierte Beispiel, aber ich bin nicht ganz zu bekommen.
Hier ist, was ich versuche:
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)
, aber ich erhalte einen Index außerhalb der Grenzen Fehler beim args[0]
nennen.
Gibt es eine Möglichkeit, den Zugriff auf die Anfrage Argument in die „Hallo“ -Funktion in dem „login_required“ Dekorateur geben bekommen kann?
Lösung
Der Dekorateur login_required
wird die Funktion (hello
in diesem Fall) übergeben.
Also, was Sie tun möchten, ist:
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
Andere Tipps
kwargs
ist ein Wörterbuch als Schlüssel und Werte als Wert enthält Argument.
Also alles, was Sie tun müssen, ist Check:
some_var = kw['my_property']