Проверьте, есть ли у функции декоратор

Мой вопрос является общим, но в частности мое приложение является декодером login_required для Django.

Мне любопытно, есть ли способ проверить, имеет ли представление/функцию определенный декоратор (в данном случае декодер login_required)

Я перенаправляю после входа пользователя в систему, и я хочу перенаправить на главную страницу, если на странице, на которой они в данный момент находятся, есть декодер login_required. Мои поиски пока не дали никаких результатов.

Ответы

Ответ 1

Создайте свой собственный декоратор login_required и отметьте функцию как украшенную - возможно, лучшее место для ее отметки будет в func_dict.

from django.contrib.auth.decorators import login_required as django_l_r

# Here you're defining your own decorator called `login_required`
# it uses Django built in `login_required` decorator
def login_required(func):
    decorated_func = django_l_r(func)
    decorated_func.func_dict['login_is_required'] = True
    return decorated_func

@login_required # Your decorator
def authenticatedd_view(request):
    pass

def unauthenticated_view(request):
    pass

Теперь вы можете проверить, было ли оформлено изображение таким образом...

# Assume `a_view` is view function
>>> a_view.func_dict.get('login_is_required',False)

Если вы смущены о декораторах Python, см. этот SO-вопрос/ответ: Как создать цепочку декораторов функций?

Ответ 2

Кажется, что ваша ситуация такова: 1. У вас есть страницы, которые защищены, и за декором, требуемым для входа в систему 2. У вас есть страницы, которые не защищены и могут быть посещены как в состоянии входа в систему, так и в анонимном состоянии.

Если я понимаю ваши требования, вы хотите, чтобы пользователь перенаправлялся на главную страницу (предполагая, что это страница приветствия, которую можно посетить как в состоянии входа в систему, так и в анонимное состояние), когда пользователь выходит из системы.

Почему бы вам просто не ограничивать возможность входа в систему только с защищенных страниц, а затем настроить redirect_url на выход на экран приветствия?