От ccbv.co.uk и от Django Class-bases views docs, dispatch()
является первым методом, который называется в одном классе базе просмотра.
рабочего Просмотра класса
- диспетчерские()
- http_method_not_allowed()
- опции()
Имейте в виде, чем весь родовой вид наследует Посмотреть класс
Middleware - хорошее решение, но если вы это сделаете не нужно предварительно обрабатывать каждый запрос, вы можете использовать доступ к смесителю.
Как я уже говорил, dispatch()
- это первый выполненный метод, поэтому вы можете повторно записать его, чтобы предоставить или запретить доступ к представлению.
Вот dispatch
код по умолчанию:
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
Вы можете написать mixin
класс:
class SuperuserRequiredMixin(object):
"""
Mixin allows you to require a user with `is_superuser` set to True.
"""
login_url = settings.LOGIN_URL # LOGIN_URL from project settings
raise_exception = False # Default whether to raise an exception to none
redirect_field_name = REDIRECT_FIELD_NAME # Set by django.contrib.auth
def dispatch(self, request, *args, **kwargs):
if not request.user.is_superuser: # If the user is a standard user,
if self.raise_exception: # *and* if an exception was desired
return HttpResponseForbidden() # return a forbidden response.
else:
# otherwise, redirect the user to the login page.
# Also, handily, sets the `next` GET argument for
# future redirects.
path = urlquote(request.get_full_path())
tup = self.login_url, self.redirect_field_name, path
return HttpResponseRedirect("%s?%s=%s" % tup)
return super(SuperuserRequiredMixin, self).dispatch(request, *args, **kwargs)
Затем вы можете использовать его в своих взглядах. Давайте предположим, что ListView
:
from django.views.generic import ListView
from somewhere import SuperuserRequiredMixin
class MyView(ListView, SuperuserRequiredMixin):
...
# Do what you usually do...
Я надеюсь, вы найдете это полезным.
Я думаю, вам нужно [промежуточное программное обеспечение] (https://docs.djangoproject.com/en/1.8/topics/http/middleware/#process_request). Это также может быть полезно [запрос и ответные документы из Django] (https://docs.djangoproject.com/en/1.8/topics/http/middleware/#hooks-and-application-order) – Gocht