Как запустить кусок кода во всех представлениях в 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".
На странице также есть пример специального шаблона аутентификации, который вы можете использовать для любого стиля!