0

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

11

Я пытаюсь написать декоратор "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 ответ(ов)

0

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

Эта структура позволяет вам обрабатывать логику проверки авторизации перед выполнением основной функции, защищая доступ к ней.

0

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

Поэтому вам просто нужно проверить:

some_var = kwargs['my_property']
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь