Способ, которым я решил это, состоял в том, чтобы иметь класс mixin, с декоратором (или любым другим кодом, который вам нужен).Хотя вы должны помнить, что нужно вызывать функцию super(Class, self).get(...)
, поэтому я думаю, что она, в конце концов, не так уж и отличается.
С другой стороны, наличие набора миксинов, которые делают разные вещи, которые, как я обнаружил, было довольно хорошоочень простое представление, чтобы сделать много без большого количества кода.
Редактировать
Вот как я делал в своем последнем проекте:
class BaseAuthMixin(object):
def auth_check(self, user):
return True
def dispatch(self, request, *args, **kwargs):
if not self.auth_check(request.user):
from django.http import HttpResponseRedirect
from django.contrib.auth import logout
is_web = False
is_live = False
if hasattr(self, 'get_url_name'):
from django.core.urlresolvers import reverse
from django.core.urlresolvers import NoReverseMatch
try:
next = reverse(self.get_url_name(), kwargs=kwargs)
except NoReverseMatch:
next = ''
else:
next= '?next=' + next
logout(request)
redirect_url = settings.LOGIN_URL
redirect_url += next
return HttpResponseRedirect(redirect_url)
else:
return super(BaseAuthMixin, self).dispatch(request, *args, **kwargs)
class LoginRequiredMixin(BaseAuthMixin):
"""
Check if the view needs the user to be logged in.
"""
def auth_check(self, user):
if not super(LoginRequiredMixin, self).auth_check(user):
return False
else:
if hasattr(self, 'login_required'):
if self.login_required and not user.is_authenticated():
return False
return True
class MyDefaultMixin(LoginRequiredMixin):
"""
Mixin that inherits from all common view mixins.
"""
pass
Затем вышеприведенное используетсяклассы представлений (я использовал Django 1.3 с представлениями на основе классов):
from django.views.generic import TemplateView
class SomeViewClass(TemplateView, MyDefaultMixin):
# Used by 'LoginRequiredMixin' to check if a user has to be logged in
login_required = True
# Template for the Django TemplateView
template_name = "some_view_template.html"
Требуется представление для обработки имени входа (с URL-адресом в settings.LOGIN_URL
), содержащее форму со скрытым полем под названиемnext
.Это поле должно быть задано контекстной переменной для перехода на страницу после успешного входа в систему.
Если все представления наследуются от базового миксина (MyDefaultMixin
в моем коде выше), он автоматически проверит, чтоПользователь вошел в систему iv. Представление содержит атрибут с именем login_required
, для которого установлено значение True
.
Возможно, есть лучшие способы сделать это, но это то, что я сделал, и это сработало очень хорошо.