繁体   English   中英

确定用户是否在“ LogoutView”中通过了身份验证

[英]Determine whether the user was authenticated in “LogoutView”

不论您之前是否登录,当您转到127.0.0.1:8000/admin/logout ,Django始终显示同一页面。

我想要的是仅在用户之前通过身份验证时显示“ 注销成功”消息 如果用户未通过身份验证,则显示错误消息,然后尝试注销。

我还需要在注销成功消息中包含用户的first_name

我正在使用基于类的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始终为Falsefirst_name始终为None

我知道如何使用基于函数的视图来处理这种情况,但是我更喜欢使用基于类的视图(如果可以的话!)。

提前致谢。

将用户注销是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

在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 %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM