Определите, был ли пользователь аутентифицирован в «LogoutView» - PullRequest
0 голосов
/ 24 июня 2019

Django всегда показывает одну и ту же страницу, когда вы переходите на 127.0.0.1:8000/admin/logout, независимо от того, входили вы ранее или нет.

То, что я хочу, - это сообщение об успешном выходе из системы * только 1007 * , если пользователь был аутентифицирован ранее ; и показать сообщение об ошибке, если пользователь не прошел аутентификацию и попытается выйти из системы.

Мне также нужно включить имя пользователя в мое сообщение об успешном выходе из системы.

Я использую основанный на классах django.contrib.auth.views.LogoutView вид так:

class SignoutView(LogoutView):
    template_name = "users/signout.html"

    def get_next_url(self):
        redirect_to = self.request.GET.get("next", "/")
        return redirect_to

и вот шаблон:

{% extends "base.html" %}
{% block content %}
<h1>Sign out Page</h1>
<br>
{% if was_authenticated %}
<div class="alert alert-success" role="alert">
  <h4 class="alert-heading">You have logged out from your account {{first_name|capfirst}}!</h4>
  <p>Thanks for spending some quality time with my web site today.</p>
  <hr>
  <p class="mb-0" id="displayTimer"></p>
</div>
{% else %}
<div class="alert alert-danger" role="alert">
  <h4 class="alert-heading">Ooh no!</h4>
  <p>Looks like you are not logged in! So you can not log out! Cool yeah?</p>
</div>
{% endif %}
{% endblock %}


{% block js %}
{% if was_authenticated %}
<script type="text/javascript">
var count = 5;
var url = "{{redirect_address}}";
var countdown = setInterval(function() {
  $('#displayTimer').text("You will be redirected to the home page in " + count-- + " seconds...");
  if (count < 0) {
    $('#displayTimer').text("Redirecting....");
    clearInterval(countdown);
    $(location).attr("href", url);
  }
}, 1000);
</script>
{% endif %}
{% endblock %}

Я добавляю дополнительный контент для просмотра следующим образом:

class SignoutView(LogoutView):
    template_name = "users/signout.html"

    def set_extra_context(self):
        return {
            'was_authenticated': self.request.user.is_authenticated,
            'first_name': self.request.user.first_name,
        }

    def get_next_url(self):
        redirect_to = self.request.GET.get("next", "/")
        return redirect_to

но похоже, что функция будет запущена после процесса выхода из системы , поэтому was_authenticated всегда будет False и first_name всегда Нет .

Я знаю, как справиться с этой ситуацией с представлениями на основе функций , но я предпочитаю использовать представления на основе классов (если это возможно здесь!).

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Выход пользователя из системы - самое первое действие в методе dispatch.Поэтому для сбора данных от этого пользователя, например имени, вам необходимо переопределить этот метод и захватить эти данные перед вызовом выхода из системы.

Вы можете сделать что-то вроде:

@method_decorator(never_cache)
def dispatch(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        self.first_name = request.user.first_name
    return super().dispatch(request, *args, **kwargs)

строка в источнике для справки;https://github.com/django/django/blob/master/django/contrib/auth/views.py#L116

0 голосов
/ 24 июня 2019

В сценарии Python (> = 3.6): переопределить dispatch метод, подобный приведенному ниже, и добавить сообщение об успехе

from django.contrib import messages

class SignoutView(LogoutView):
    template_name = "users/signout.html"

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            messages.success(request, f'{request.user.first_name} successfully logged out')
        else:
            messages.error(request, f'{request.user.first_name} your error message')
        return super().dispatch(request, *args, **kwargs)

В шаблоне:

{% if messages %}
          {% for message in messages %}
                        <div class="alert temp-alert {% if message.tags %}alert-{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}danger{% else %}{{ message.tags }}{% endif %}{% endif %}" role="alert">{{ message }}</div>
          {% endfor %}
{% endif %}
...