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

StackOverflow https://stackoverflow.com/questions/1010080

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Однако я не могу понять, как получить этот экземпляр 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 " декоратор?

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top