Доброго времени суток.
Разбирался с примером на effectivedjango.com, с авторизацией пользователей и вывода информации принадлежащей конкретному пользователю. link
пример кода, который заставил долго думать:
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class LoggedInMixin(object):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(LoggedInMixin, self).dispatch(*args, **kwargs)
Собственно пытаясь понять происходящее я пришёл к таким выводам:
method_decorator - декоратор, который конвертирует декоратор
функций в декоратор
методов класса. Ему для конвертации был передан декоратор
login_requred, который предназначен для вьюх, и проверяет пользователя на то залогинен он или нет, и если нужно делает redirect на страницу логина. Собственно это строчка
@method_decorator(login_required) возвращает декоратор метода класса, в него мы оборачиваем ф-ю
dispatch(self, *args, **kwargs), которая теперь умеет проверять наличие логина у пользователя, а так же возвращает/перекрывает метод
dispatch(self, request, *args, **kwargs) у насоедованных от generic классов, тем самым защищает от любого
request'а нашу class-based view, пока не будет проверен залогинен ли пользователь.
Данный примесный класс применяется следующим образом:
class ListContactView(LoggedInMixin, ListView):
model = Contact
template_name = 'contact_list.html'
def get_queryset(self):
return Contact.objects.filter(owner=self.request.user)
В итоге мы получаем список контактов, которые создал конкретный пользователь.
Прошу, вас, исправить меня, если я допустил ошибки в размышлениях. А также прошу подсказать, где можно почитать про примесные классы, т.к. по этой теме я нашел лишь в книге Лутца небольшой параграф, и примеры в параграфе строятся на основе предыдущих нескольких параграфов.