Как запустить кусок кода во всех представлениях в django?

Мне нужно проверить авторизацию пользователя во всех представлениях одного из моих приложений Django (я не использую Django, встроенного в систему auth) и перенаправить пользователя на страницу "login please", если авторизация не удалась.

Код выглядит следующим образом:

try:
    admin_from_session = request.session['admin'];
    admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True);
except KeyError, Administrator.DoesNotExist:
    return HttpResponseRedirect('/controlpanel/login')

Вопрос: как я могу запустить этот код в начале каждого представления, не повторяя его каждый раз?

Если бы я написал свою программу на PHP, я бы поместил этот код в отдельный файл и написал что-то вроде этого в начале каждой страницы, требующей авторизации:

include("redirect_if_not_logged_in.inc.php");

Решения, которые я нашел, были:

  • теги включения - не делает, потому что я не могу перенаправить нигде оттуда
  • пользовательская функция - также не делает, из-за того же причина.

Задача кажется тривиальной, но я не могу найти решение. Я был бы очень благодарен за любую помощь.

Ответ 1

Посмотрите исходный код для django.contrib.auth decorators. Они делают именно то, что вы хотите, но для встроенной системы аутентификации Django (см. Документацию). Не сложно сделать что-то подобное для вашей системы аутентификации.

Кстати, почему бы вам не использовать встроенный auth? Вы можете использовать его с пользовательскими серверами аутентификации...

Ответ 2

Я нашел ответ, который искал. Декораторы функций позволяют запускать код мира в начале функции.

Вы должны определить функцию декоратора

def login_please_decorator(view_func):
    """
        Redirect if admin was not logged in
    """
    def _decorated(request, *args, **kwargs):
        #Check authorization
        try:
            admin_from_session = request.session['admin'];
            admin = Administrator.objects.get(login = admin_from_session.login, password = admin_from_session.password, enabled=True);
            return view_func(request,*args, **kwargs);
        except KeyError, Administrator.DoesNotExist:
            return HttpResponseRedirect('/cp/login?ret=' + request.path);

    return _decorated 

И украсьте представление, используя это имя функции:

@login_please_decorator
def some view(request):   
    # do something ...
    # ...

Людвик Траммер, bugspy.net, спасибо за вашу помощь.

Ответ 3

Вспомогательные функции декоратора приходят на ум

Ответ 4

Взгляните на страницу аутентификации пользователя здесь http://docs.djangoproject.com/en/dev/topics/auth/

Читайте на "Декодер, оформленный login_required".

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
   ...

Вы можете настроить, где пользователь должен быть перенаправлен, если не аутентифицирован с помощью параметра "settings.LOGIN_URL".

На странице также есть пример специального шаблона аутентификации, который вы можете использовать для любого стиля!