django 支持的网站在登录用户之间切换

django powered website switches between logged in users

我正在尝试查找 Django 支持的网站出现以下问题的根本原因。问题是:

偶尔,当前登录网站的用户在单击网站上的随机链接时,会自动切换到其他用户以及该用户的权限。 目前尚不清楚在哪种情况下会发生这种情况。访问网站上的不同页面可能会让他回到登录状态。

Django 版本:1.9.4

网络服务器:Apache/2.4.7 (Ubuntu 12.04)

数据库:mysql5.5.4

Python: 2.7.3

MIDDLEWARE_CLASSES = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

模板缓存已启用:

loaders = [('django.template.loaders.cached.Loader', [
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
]),
]

本网站在模板中使用 {% if user.is_authenticated %}。 user 变量只设置一次,就是在用户登录的时候。LDAP Backend for authentication

user = authenticate(username=username, password=password)

函数是运行,然后是

login(self.request, user)
return super(LoginView, self).form_valid(form)

我阅读了各种关于 Django 如何进行会话处理的博客文章。但我不明白 refreshing/clicking 周围的随机链接如何将当前用户切换到另一个用户。

如果有人知道在这种情况下可能出了什么问题,请回复。我希望我已经给出了解释问题和环境所需的信息。

登录视图:

from __future__ import unicode_literals
from django.views import generic
from django.contrib.auth import get_user_model
from django.contrib.auth import authenticate, login, logout
from django.core.urlresolvers import reverse_lazy
from .forms import LoginForm

User = get_user_model()


class LoginView(generic.FormView):
form_class = LoginForm
success_url = reverse_lazy('home')
template_name = 'accounts/login.html'

def form_valid(self, form):
    username = form.cleaned_data['username']
    password = form.cleaned_data['password']
    user = authenticate(username=username, password=password)

    if user is not None and user.is_active:
        login(self.request, user)
        return super(LoginView, self).form_valid(form)
    else:
        return self.form_invalid(form)


class LogoutView(generic.RedirectView):
url = reverse_lazy('home')

def get(self, request, *args, **kwargs):
    logout(request)
    return super(LogoutView, self).get(request, *args, **kwargs)

我没有看到 User = get_user_model() 中的 User 在应用程序的任何地方使用。我做了一个递归 grep,以防万一这个细节很重要。

经过更多的研究和阅读,我发现问题出在 cache_page 的错误使用上。 cache_pagevary_on_headers 是避免我所见问题的正确方法。