Как запустить кусок кода в каждом представлении в Django? - PullRequest
10 голосов
/ 19 февраля 2010

Мне нужно проверять авторизацию пользователя в каждом представлении одного из моих приложений 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");

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

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

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

Ответы [ 4 ]

6 голосов
/ 19 февраля 2010

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

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

2 голосов
/ 24 февраля 2010

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

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

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

1 голос
/ 19 февраля 2010

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

0 голосов
/ 19 февраля 2010

Взгляните на страницу аутентификации пользователя здесь 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".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...