2009-06-17 2 views
18

Я пытаюсь написать декоратор «login_required» для представлений в приложении WSGI + Werkzeug.Python - получить исходные аргументы функции в декораторе

Для этого мне нужно перейти на сеанс пользователя, который доступен через объект Request, который передается в методы просмотра.

Я не могу понять, как получить этот экземпляр запроса в декораторе. Я посмотрел на PEP318, в частности на четвертый пример, но я не совсем понял.

Вот что я хочу:

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) 

, но я получаю индекс из оценки погрешности, пытаясь вызвать args[0].

Есть ли способ получить доступ к аргументу запроса, переданному в функцию «привет» в «login_required» декораторе?

ответ

23

Декоратор login_required передается функция (hello в этом случае).

Так что вы хотите сделать, это:

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

Отлично! Я использовал другой синтаксис, который использовался в «экспорте» декоратора - я не уверен, что понимаю альтернативный синтаксис. – ashgromnies

2

kwargs является словарь, содержащий аргумент в качестве ключей и значений в качестве значений.

Так все, что вам нужно сделать, это проверить: some_var = kw['my_property']