Обертывание функций представления
Последний прием, который мы рассмотрим, опирается на относительно редко используемую возможность Python. Предположим, что в разных представлениях многократно встречается один и тот же код, например:
def my_view1(request):
if not request.user.is_authenticated():
return HttpResponseRedirect(‘/accounts/login/’) tt . ..
return render_to_response(‘templatel.html’)
def my_view2(request):
if not request.user.is_authenticated():
return HttpResponseRedirect(‘/accounts/login/’) tt . ..
return render_to_response(‘template2.html’)
def my_view3(request):
if not request.user.is_authenticated():
return HttpResponseRedirect(‘/accounts/login/’) tt . ..
return render_to_response(‘template3.html’)
Здесь в начале каждого представления проверяется, что пользователь request.user аутентифицирован, то есть успешно прошел процедуру проверки при заходе на сайт. Если это не так, производится переадресация на страницу /accounts/login/.
Примечание ——————————————————————————
Мы еще не говорили об объекте request.user - это тема главы 14, - но отметим, что request.user представляет текущего пользователя, аутентифициро- ванного или анонимного.
Хорошо бы убрать повторяющийся код и просто как-то пометить, что представления требуют аутентификации. Это можно сделать с помощью обертки представления. Взгляните на следующий фрагмент:
def requires_login(view):
def new_view(request, *args, **kwargs): if not request.user.is_authenticated():
return HttpResponseRedirect(‘/accounts/login/’) return view(request, *args, **kwargs) return new_view
Функция requires_login принимает функцию представления (view) и возвращает новую функцию представления (new_view). Функция new_view определена внутри requires_login, она проверяет request.user.
is_authenticated() и делегирует работу исходному представлению view. Теперь можно убрать проверки if not request.user.is_authenticated()H3 наших представлений и просто обернуть их функцией requires_login в конфигурации URL:
from django.conf.urls.defaults import *
from mysite.views import requires_login, my_view1, my_view2, my_view3
urlpatterns = patternsC’,
(r’~view1/$’, requires_login(my_view1)), (r’~view2/$’, requires_login(my_view2)), (r’~view3/$’, requires_login(my_view3)),
)
Результат при этом не изменяется, а дублирование кода устранено. Имея обобщенную функцию requires_login(), мы можем обернуть ею любое представление, которое требует предварительной аутентификации.
Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.
Похожие посты:
- Устранение отступа между элементом h1 и следующим за ним абзацем (0)
- Интерпретация сообщений, выводимых инструментом W3C Validator (0)
- Справочник по обобщенным представлениям Django (0)
- Утилита django-admin - ЧАСТЬ 2 (0)
- Конфигурация URL и слабая связанность (0)
- Третье представление: динамические URL-адреса (0)
- Использование шаблонов в представлениях Django (0)