Я должен проверить авторизацию пользователя в каждое представление одного из моих приложений 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");
Решения, которые я нашел, были:
Задача кажется тривиальной, но я не могу найти решение. Я был бы очень благодарен за любую справку.
Посмотрите исходный код декораторов django.contrib.auth. Они делают именно то, что вы хотите, но для встроенной системы аутентификации Django (см. документацию). Не должно быть сложно сделать что-то подобное для вашей системы аутентификации.
BTW, почему бы вам не использовать встроенный auth? Вы можете использовать его с пользовательскими бэкендами аутентификации...
Посмотрите на страницу аутентификации пользователя здесь 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" можно настроить, куда перенаправлять пользователя, если он не прошел аутентификацию.
На странице также есть пример специального шаблона аутентификации, который вы можете изменить на любой вкус!
Я нашел ответ, который искал. Декораторы функций позволяют запускать кусок кода в начале функции.
Вы должны определить функцию-декоратор
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, спасибо за вашу помощь.