Класс LogoutView (Django 2.1)

from django.contrib.auth.views import LogoutView

Выводит пользователя из системы и отображает сообщение "Вы вышли из системы".

Атрибуты

  Определено в
content_type = None TemplateResponseMixin
extra_context = None ContextMixin
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] View
next_page = None LogoutView
redirect_field_name = 'next' LogoutView
response_class = <class 'django.template.response.TemplateResponse'> TemplateResponseMixin
success_url_allowed_hosts = set() SuccessURLAllowedHostsMixin
template_engine = None TemplateResponseMixin
template_name = None TemplateResponseMixin
template_name = 'registration/logged_out.html' LogoutView

Методы

def _allowed_methods(self):
    return [m.upper() for m in self.http_method_names if hasattr(self, m)]

Основная точка входа процесса "запрос-ответ".

@classonlymethod
def as_view(cls, **initkwargs):
    """Main entry point for a request-response process."""
    for key in initkwargs:
        if key in cls.http_method_names:
            raise TypeError("You tried to pass in the %s method name as a "
                            "keyword argument to %s(). Don't do that."
                            % (key, cls.__name__))
        if not hasattr(cls, key):
            raise TypeError("%s() received an invalid keyword %r. as_view "
                            "only accepts arguments that are already "
                            "attributes of the class." % (cls.__name__, key))
    def view(request, *args, **kwargs):
        self = cls(**initkwargs)
        if hasattr(self, 'get') and not hasattr(self, 'head'):
            self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
        return self.dispatch(request, *args, **kwargs)
    view.view_class = cls
    view.view_initkwargs = initkwargs
    # take name and docstring from class
    update_wrapper(view, cls, updated=())
    # and possible attributes set by decorators
    # like csrf_exempt from dispatch
    update_wrapper(view, cls.dispatch, assigned=())
    return view
LogoutView
@method_decorator(never_cache)
def dispatch(self, request, *args, **kwargs):
    auth_logout(request)
    next_page = self.get_next_page()
    if next_page:
        # Redirect to this page until the session has been cleared.
        return HttpResponseRedirect(next_page)
    return super().dispatch(request, *args, **kwargs)
View
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)
def get(self, request, *args, **kwargs):
    context = self.get_context_data(**kwargs)
    return self.render_to_response(context)
LogoutView
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    current_site = get_current_site(self.request)
    context.update({
        'site': current_site,
        'site_name': current_site.name,
        'title': _('Logged out'),
        **(self.extra_context or {})
    })
    return context
ContextMixin
def get_context_data(self, **kwargs):
    kwargs.setdefault('view', self)
    if self.extra_context is not None:
        kwargs.update(self.extra_context)
    return kwargs
def get_next_page(self):
    if self.next_page is not None:
        next_page = resolve_url(self.next_page)
    elif settings.LOGOUT_REDIRECT_URL:
        next_page = resolve_url(settings.LOGOUT_REDIRECT_URL)
    else:
        next_page = self.next_page
    if (self.redirect_field_name in self.request.POST or
            self.redirect_field_name in self.request.GET):
        next_page = self.request.POST.get(
            self.redirect_field_name,
            self.request.GET.get(self.redirect_field_name)
        )
        url_is_safe = is_safe_url(
            url=next_page,
            allowed_hosts=self.get_success_url_allowed_hosts(),
            require_https=self.request.is_secure(),
        )
        # Security check -- Ensure the user-originating redirection URL is
        # safe.
        if not url_is_safe:
            next_page = self.request.path
    return next_page
def get_success_url_allowed_hosts(self):
    return {self.request.get_host(), *self.success_url_allowed_hosts}

Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response() is overridden.

def get_template_names(self):
    """
    Return a list of template names to be used for the request. Must return
    a list. May not be called if render_to_response() is overridden.
    """
    if self.template_name is None:
        raise ImproperlyConfigured(
            "TemplateResponseMixin requires either a definition of "
            "'template_name' or an implementation of 'get_template_names()'")
    else:
        return [self.template_name]
def http_method_not_allowed(self, request, *args, **kwargs):
    logger.warning(
        'Method Not Allowed (%s): %s', request.method, request.path,
        extra={'status_code': 405, 'request': request}
    )
    return HttpResponseNotAllowed(self._allowed_methods())

Конструктор. Вызывается в URLconf; может содержать полезные дополнительные ключевые аргументы и другие вещи.

def __init__(self, **kwargs):
    """
    Constructor. Called in the URLconf; can contain helpful extra
    keyword arguments, and other things.
    """
    # Go through keyword arguments, and either save their values to our
    # instance, or raise an error.
    for key, value in kwargs.items():
        setattr(self, key, value)

Обрабатывает ответы на запросы для запроса HTTP OPTIONS.

def options(self, request, *args, **kwargs):
    """Handle responding to requests for the OPTIONS HTTP verb."""
    response = HttpResponse()
    response['Allow'] = ', '.join(self._allowed_methods())
    response['Content-Length'] = '0'
    return response

Logout may be done via POST.

def post(self, request, *args, **kwargs):
    """Logout may be done via POST."""
    return self.get(request, *args, **kwargs)

Возвращает ответ (response), используя `response_class` для этого представления, с шаблоном, отображаемым с заданным контекстом. Передает response_kwargs в конструктор класса ответа.

def render_to_response(self, context, **response_kwargs):
    """
    Return a response, using the `response_class` for this view, with a
    template rendered with the given context.
    Pass response_kwargs to the constructor of the response class.
    """
    response_kwargs.setdefault('content_type', self.content_type)
    return self.response_class(
        request=self.request,
        template=self.get_template_names(),
        context=context,
        using=self.template_engine,
        **response_kwargs
    )