2009-06-17 4 views
18

J'essaye d'écrire un décorateur "login_required" pour les vues dans une application WSGI + Werkzeug. Pour ce faire, je dois obtenir à la session de l'utilisateur, qui est accessible via l'objet de demande qui est passé dans les méthodes d'affichage.Python - Obtenir des arguments de fonction d'origine dans le décorateur

Je ne peux pas comprendre comment obtenir à cette instance de demande dans le décorateur, cependant. J'ai regardé le PEP318, en particulier le quatrième exemple, mais je ne comprends pas très bien.

Voici ce que je suis en train:

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) 

mais je reçois un index sur une erreur de limites en essayant d'appeler args[0].

Est-il possible d'accéder à l'argument request passé dans la fonction "hello" du décorateur "login_required"?

Répondre

23

Le décorateur login_required est passé la fonction (hello dans ce cas).

donc ce que vous voulez faire est:

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

Parfait! J'utilisais une syntaxe différente qui était utilisée dans le décorateur "exposer" - je ne suis pas sûr de comprendre la syntaxe alternative. – ashgromnies

2

kwargs est un argument contenant le dictionnaire comme des clés et des valeurs en tant que valeurs.

Donc, tout ce que vous devez faire est de vérifier: some_var = kw['my_property']

Questions connexes