我正在尝试使用Django支持的网站找到以下问题的根本原因。问题是:
偶尔,当前登录网站的用户点击网站上的随机链接会自动切换到其他用户以及该用户的权限。 目前尚不清楚这种情况会发生在哪种情况。访问网站上的不同页面可能会使他回到登录状态。
Django版本:1.9.4
Webserver:Apache / 2.4.7(Ubuntu 12.04)
数据库:mysql 5.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 %}
。用户变量只设置一次,并且用户登录时。用于身份验证的LDAP后端
user = authenticate(username=username, password=password)
运行功能,然后
login(self.request, user)
return super(LoginView, self).form_valid(form)
我阅读了有关Django如何进行会话处理的各种博客文章。但我不明白随机链接的刷新/点击如何将当前用户切换到另一个用户。
如果有人知道在这种情况下会出现什么问题,请回复。我希望我已经提供了解释问题和环境所需的信息。
LoginView:
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
的{{1}}。我做了一个递归grep,以防这个细节很重要。
答案 0 :(得分:0)
经过一些研究和阅读后,我发现cache_page
使用不正确的问题。
cache_page
以及vary_on_headers
是避免我见过的问题的正确方法。