Python - Получение оригинальных аргументов функции в декораторе
Я пытаюсь написать декоратор "login_required" для представлений в приложении WSGI+Werkzeug.
Для этого мне нужно получить доступ к сессии пользователя, которая доступна через объект Request, передаваемый в методы представления.
Но я не могу понять, как получить экземпляр Request в декораторе. Я изучал PEP 318, особенно четвертый пример, но все равно не могу это реализовать.
Вот что я пытаюсь сделать:
def login_required(*args, **kw):
def goto_login(**kw):
return redirect(url_for('login'))
def decorate(f):
# args[0] должен быть 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]
.
Есть ли способ получить доступ к аргументу request, переданному в функцию "hello", в декораторе "login_required"?
2 ответ(ов)
Декоратор login_required
принимает в качестве аргумента функцию (hello
в данном случае).
Таким образом, вы хотите сделать следующее:
def login_required(f):
# Эта функция заменяет hello
def wrapper(*args, **kw):
args[0].client_session['test'] = True # Устанавливаем значение в сессии
logged_in = 0 # Проверка, залогинен ли пользователь
if logged_in:
return f(*args, **kw) # Вызываем hello
else:
return redirect(url_for('login')) # Перенаправление на страницу входа
return wrapper
Эта структура позволяет вам обрабатывать логику проверки авторизации перед выполнением основной функции, защищая доступ к ней.
kwargs
— это словарь, где ключами являются аргументы, а значениями — их значения.
Поэтому вам просто нужно проверить:
some_var = kwargs['my_property']
Как создать декораторы функций и объединить их?
Декораторы с параметрами?
Как заставить фикстуры pytest работать с декорированными функциями?
Преобразование строки даты JSON в datetime в Python
Создание и чтение временного файла