Обертывание функций представления

Опубликовал: Tuesday, January 31, 2024 в категории Django | Пока нет комментариев

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

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *