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_page
和 vary_on_headers
是避免我所见问题的正确方法。
我正在尝试查找 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_page
和 vary_on_headers
是避免我所见问题的正确方法。