Python - Récupère les arguments de la fonction originale dans decorator
Question
J'essaie d'écrire un " login_required " décorateur pour les vues dans une application WSGI + Werkzeug.
Pour ce faire, je dois accéder à la session de l'utilisateur, accessible via l'objet Request transmis aux méthodes d'affichage.
Je n'arrive pas à comprendre comment obtenir cette instance de Request dans le décorateur, cependant. J'ai examiné PEP318, plus précisément le quatrième exemple, mais je ne le comprends pas très bien.
Voici ce que j'essaie:
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 j'obtiens une erreur d'index hors limites en essayant d'appeler args [0]
.
Existe-t-il un moyen quelconque d'avoir accès à l'argument de requête passé dans le message "hello"? fonction dans le " login_required " décorateur?
La solution
Le décorateur login_required
se voit attribuer la fonction ( hello
dans ce cas).
Ce que vous voulez faire, c'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
Autres conseils
kwargs
est un dictionnaire contenant des arguments sous forme de clés et des valeurs sous forme de valeurs.
Il suffit donc de vérifier:
some_var = kw ['my_property']