2009-06-17 11 views
18

Ich versuche, einen "login_required" Decorator für die Ansichten in einer WSGI + Werkzeug-Anwendung zu schreiben.Python - Erhalte originale Funktionsargumente in Decorator

Um dies zu tun, muss ich auf die Benutzersitzung, die über das Request-Objekt zugänglich ist, die in die Ansicht Methoden übergeben wird.

Ich kann jedoch nicht herausfinden, wie man im Dekorateur auf diese Instanz der Anfrage kommt. Ich schaute auf PEP318, genauer auf das vierte Beispiel, aber ich verstehe es nicht ganz.

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 eine Indexgrenzen Fehler aus versuchen args[0] zu nennen.

Gibt es eine Möglichkeit, Zugriff auf das Anforderungsargument zu erhalten, das an die "Hallo" -Funktion im "login_required" -Dekorator übergeben wird?

Antwort

23

Der Dekorateur login_required hat die Funktion (hello in diesem Fall) bestanden.

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 
+1

Perfect! Ich habe eine andere Syntax verwendet, die im "expose" -Dekorator verwendet wurde - ich bin mir nicht sicher, ob ich die alternative Syntax verstehe. – ashgromnies

2

kwargs ein Wörterbuch ist als Schlüssel und Werte als Werte enthalten Argument.

Also alles, was Sie tun müssen, ist Check: some_var = kw['my_property']