Проверьте, есть ли у функции декоратор
Мой вопрос является общим, но в частности мое приложение является декодером 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 на выход на экран приветствия?