Как выполнить часть кода в каждом представлении в django?

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

Код похож на это:

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");

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

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

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

10
задан SilentGhost 19 February 2010 в 12:11
поделиться

4 ответа

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

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

6
ответ дан 4 December 2019 в 01:56
поделиться

На ум приходят декораторы функций

1
ответ дан 4 December 2019 в 01:56
поделиться

Посмотрите на страницу аутентификации пользователя здесь 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" можно настроить, куда перенаправлять пользователя, если он не прошел аутентификацию.

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

0
ответ дан 4 December 2019 в 01:56
поделиться

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

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

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, спасибо за вашу помощь.

2
ответ дан 4 December 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: