Estoy tratando de escribir un «login_required» decorador para las vistas en un WSGI+Werkzeug aplicación.

Con el fin de hacer esto, tengo que llegar a la sesión del usuario, el cual es accesible a través de la Solicitud objeto que se pasa a la vista de los métodos.

Que no puedo averiguar cómo llegar a la instancia de Solicitud en el decorador, aunque. Miré a PEP318, específicamente el cuarto ejemplo, pero no estoy consiguiendo.

Aquí es lo que estoy tratando:

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 me da un índice fuera de los límites de error tratando de llamar args[0].

¿Hay alguna manera de obtener acceso a la solicitud argumento pasado en el «hola» de la función en el «login_required» decorador?

InformationsquelleAutor ashgromnies | 2009-06-17

2 Comentarios

  1. 39

    El decorador login_required se pasa a la función (hello en este caso).

    Así que lo que quiero 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
    • Perfecto! Yo estaba usando una sintaxis diferente que se utilizó en el «exponer» decorador – no estoy seguro de entender la sintaxis alternativa.
  2. 3

    kwargs es un diccionario que contiene el argumento como las claves y los valores como valores.

    Así que todo lo que usted necesita hacer es comprobar:
    some_var = kw['my_property']

    • Esto sólo funciona si se llama a la función a través de un dict a pesar de derecho ?
    • yep. si se llama a la función como decorated_func(a, b, c), kwargs estará vacía.

Dejar respuesta

Please enter your comment!
Please enter your name here