Django登录/会话未粘滞
当我的网站在生产中运行了一段时间后,我的用户登录时突然出现问题 我已经用login_所需的decorator保护了某些视图/页面,我还使用了django管理员。 当匿名用户点击其中任何一个页面时,他将被重定向到登录页面。 当该匿名用户添加其凭据时,POST请求成功,并重定向到初始页面。同时,用户获得一个新的sessionid(如预期的那样) 然而,现在的结果变得非常不可靠。按“重新加载”或导航到其他页面(需要登录)时,可能会出现以下两种结果之一: a) 识别用户并正确显示页面 b) 用户被重定向到登录页面。 我已经通过shell检查了会话的内容,没有任何变化 生产站点通过负载平衡器和8台应用服务器提供服务。更奇怪的是:如果我在测试服务器上测试相同的代码(使用相同的设置),这不是负载平衡,基本上没有流量,那么一切都正常工作 我在Ubuntu上运行Django 1.6,Apache和mod_wsgi在SSL后面的守护程序模式下运行,我使用的是会话数据库后端。我正在使用django-allauth.account进行帐户管理/登录。我的会话设置如下所示:Django登录/会话未粘滞,django,session,authentication,login,django-allauth,Django,Session,Authentication,Login,Django Allauth,当我的网站在生产中运行了一段时间后,我的用户登录时突然出现问题 我已经用login_所需的decorator保护了某些视图/页面,我还使用了django管理员。 当匿名用户点击其中任何一个页面时,他将被重定向到登录页面。 当该匿名用户添加其凭据时,POST请求成功,并重定向到初始页面。同时,用户获得一个新的sessionid(如预期的那样) 然而,现在的结果变得非常不可靠。按“重新加载”或导航到其他页面(需要登录)时,可能会出现以下两种结果之一: a) 识别用户并正确显示页面 b) 用户被重定向
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 60*60*24
SESSION_COOKIE_SECURE = True
更新
为了获得更多调试信息,我创建了以下中间件:
from django.conf import settings
class SessionDebugMiddleware(object):
def process_response(self, request, response):
session = request.session
user = getattr(request, 'user', None)
if user:
user=user.id
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
response['X-Meta-Requ'] = '{0},{1},{2},{3}'.format(session_key, session.get('_auth_user_id'), session.get('_auth_user_backend','---'), user)
return response
如果我按刷新按钮10次
- 8次我会得到这个标题: IGV0xSHEDXH50KKS9X00R0L67MX0SK,无,---,无
- 2次我会得到这个标题:X-Meta-Requ:igv0xshezhdxh50kks9x00r0l67mx0sk,330619,django.contrib.auth.backends.modelbend,330619
欢迎提供任何其他提示。我认为您遇到了问题,因为代码中存在高负载或错误(可能您只是在应用程序中的任何位置重建会话,然后忘记它:) 请尝试使用会话密钥从数据库中读取信息,以确保会话数据存在 如果数据存在但未加载到会话-这意味着您在会话处理方面遇到问题。如果数据不存在,但由于获得了2倍正确的会话数据而在过去存在,这意味着您在会话存储方面存在问题(可能是因为高负载导致数据库丢失会话数据)。你有数据库复制吗
您还使用哪个会话后端?仅仅是一个DB或缓存的\u DB?我认为您有问题,因为您的代码中存在高负载或错误(可能您只是在应用程序的任何位置重建会话,然后忘记它:) 请尝试使用会话密钥从数据库中读取信息,以确保会话数据存在 如果数据存在但未加载到会话-这意味着您在会话处理方面遇到问题。如果数据不存在,但由于获得了2倍正确的会话数据而在过去存在,这意味着您在会话存储方面存在问题(可能是因为高负载导致数据库丢失会话数据)。你有数据库复制吗
您还使用哪个会话后端?只有一个数据库或缓存的\u DB?万一有人出现此问题,也可能是由于密钥定义不一致造成的 我在设置文件中生成了我的(一个错误的决定)。 在开发模式下这很好,但一旦应用程序由WSGI提供服务,就会创建多个实例,每个实例都有不同的键。
这会导致哈希中出现混淆,并报告损坏的会话。万一有人出现此问题,也可能是由于密钥定义不一致造成的 我在设置文件中生成了我的(一个错误的决定)。 在开发模式下这很好,但一旦应用程序由WSGI提供服务,就会创建多个实例,每个实例都有不同的键。
这会导致散列中出现混乱,并报告损坏的会话。
我在Ubuntu上运行Django 1.6,Apache和mod_wsgi在SSL后面的守护程序模式下运行
为什么您有会话\u COOKIE\u HTTPONLY=True
?你不想要HTTPS会话上的COOKIE吗?是的,我想要,但据我所知,会话\u COOKIE\u HTTPONLY与HTTPS或HTTPS无关我在Ubuntu上运行Django 1.6,Apache和mod_wsgi在SSL后面的守护进程模式下运行
为什么有会话\u COOKIE\u HTTPONLY=True
?你不想要HTTPS会话上的COOKIE吗?是的,我想要,但据我所知,会话\u COOKIE\u HTTPONLY与HTTPS或HTTPS无关?!我只使用DB。我也在考虑高负荷。但实际上,如果系统因为高负载而检索到错误的数据,我会很担心。我99%确信我的代码中没有自定义会话。我已经检查了数据库,数据库中存在会话数据。我没有数据库复制。我只使用数据库。我也在考虑高负荷。但实际上,如果系统因为高负载而检索到错误的数据,我会很担心。我99%确信我的代码中没有自定义会话。我已经检查了数据库,数据库中存在会话数据。我没有数据库复制。