Python - получить исходные аргументы функции в декораторе

Я пытаюсь написать декоратор "login_required" для представлений в приложении WSGI + Werkzeug.

Для этого мне нужно получить сеанс пользователя, доступный через объект 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].

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

Ответы

Ответ 1

Декоратору 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

Ответ 2

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

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