Python: obtenga argumentos de funciones originales en el decorador
Pregunta
Estoy tratando de escribir un " login_required " decorador para las vistas en una aplicación WSGI + Werkzeug.
Para hacer esto, necesito acceder a la sesión del usuario, a la que se puede acceder a través del objeto Solicitud que se pasa a los métodos de visualización.
Sin embargo, no puedo entender cómo llegar a esa instancia de Solicitud en el decorador. Miré a PEP318, específicamente el cuarto ejemplo, pero aún no lo entiendo.
Esto es lo que estoy intentando:
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)
pero obtengo un error de índice fuera de límites al intentar llamar a args [0]
.
¿Hay alguna forma de obtener acceso al argumento de solicitud pasado al " hola " función en el " login_required " decorador?
Solución
Al decorador login_required
se le pasa la función ( hello
en este caso).
Entonces, lo que quieres hacer es:
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
Otros consejos
kwargs
es un diccionario que contiene argumentos como claves y valores como valores.
Entonces, todo lo que necesita hacer es verificar:
some_var = kw ['my_property']