Python - Получить оригинальные аргументы функции в декораторе
Вопрос
Я пытаюсь написать " 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']