Проверьте, есть ли у функции декоратор - PullRequest
14 голосов
/ 30 марта 2011

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

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

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

Ответы [ 2 ]

16 голосов
/ 30 марта 2011

Создайте свой собственный 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's 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, посмотрите этот вопрос / ответ: Как создать цепочку декораторов функций?

2 голосов
/ 30 марта 2011

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

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

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

...