【问题标题】:Django session is not deleted after logout注销后未删除 Django 会话
【发布时间】:2016-10-27 04:14:47
【问题描述】:

我最近发现我的 Django 应用程序的注销功能似乎被破坏了。我相信它在过去有效,但我不知道为什么它现在无效。

这是我的设置:

index.html:

...
{% if request.user.is_authenticated %}
    <a style="position: absolute; top: 0; left: 0;" href="{% url 'auth_logout' %}">Logout</a>
{% else %}
    <a style="position: absolute; top: 0; left: 0;" href="{% url 'auth_login' %}">Login</a>
{% endif %}
...

urls.py:

...
from django.contrib.auth import views as auth_views
...

urlpatterns = [
    ...,
    url(r'^accounts/logout/$', auth_views.logout, name='auth_logout'),
    url(r'^accounts/login/$', auth_views.login, name='auth_login'),
    ...
]

模板:

login.html:

{% extends 'simple_logo_base.html' %}

{% block content %}
    <div class="row">
        <div class="col-md-3"></div>
        <div class="col-md-6">
            <h2>Login</h2>
            {% if next %}
                <form action="/accounts/login/?next={{next}}" method="post" >
            {%else%}
                <form action="/accounts/login/" method="post" >
            {% endif %}
                {% csrf_token %}
                {{ form.as_p }}
                <button type="submit">Login</button>
            </form>
        </div>
        <div class="col-md-3"></div>
    </div>
{% endblock %}

注销.html:

{% extends 'simple_logo_base.html' %}

{% block content %}
    <h2 class="text-center">Logged out</h2>
{% endblock %}

其中“simple_logo_base.html”只是简单的 html 结构,其中包含一个包含徽标的 div。

问题: 登录工作非常好。如果我尝试访问受限的 index.html 页面,我会被重定向到登录页面,可以登录并且可以访问受限页面。

一旦我登录并单击“注销”按钮(见上文),我也会被重定向到 logout.html 页面,但是,我仍然可以返回 index.html 并且我仍然处于登录状态.

因此,我查看了数据库中的“django_sessions”表,并注意到该会话从未被删除。如果我手动删除它,那么在访问 index.html 时会再次重定向到登录页面。

我做错了什么?可能是什么问题?

我最近升级到 Django 1.10 并且还在我的项目中添加了缓存框架。会不会与这些变化有关?

【问题讨论】:

    标签: django django-authentication django-sessions


    【解决方案1】:

    我同时解决了这个问题。但是,我不确定确切的问题是什么。如果其他人遇到类似问题,以下是我尝试过的方法(显然为我解决了问题):

    • 重置所有与身份验证相关的 url 配置
    • 使用@vary_on_cookie 装饰器根据会话缓存页面
    • 清除所有缓存和会话

    我认为问题主要与缓存有关。使用 @cache_page 装饰器时,缓存仅基于请求的 URL。因此,每个用户都会收到相同的缓存页面,即使他已经注销。但是,这并不能解释为什么在注销时会话没有被删除。所以也许其他的东西是这里的主要问题。

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2012-09-28
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多