2012-12-27 47 views
6

我有一个奇怪的错误与django会话在我的应用程序中:有些时候(对于约20000每天约10次)会话信息删除。我通过日志文件追踪它:在页面A中,用户会话的信息在他提交表单之后,在下一页他的会话是空的。我试过两种类型的存储:只有memcached + db和db,这个问题适用于他们两个。我试图重现这些场景,但是所有的工作都如预期的那样,正如我所说的那样,这种情况非常罕见。我也检查了这个问题存在于不同的用户,并且他们不会每次都重现。我没有任何想法如何抓住根本原因,我不知道还有什么在这里作为描述。如果有人有任何想法,请告诉我。如果它很重要,我使用django 1.2 + FastCGI运行我的应用程序。 谢谢!django会话的棘手问题:有时会话信息被删除

UPD:我检查并发现,在两次连续请求期间,来自用户的会话密钥未发生更改,首先请求存在实际的会话状态,而在第二个会话中,变量的相对空值为空。

+0

您是否使用任何可以创建并发请求的JavaScript,以便两者都可以修改会话? – hynekcer

+0

@hynekcer,没有会话不会更新来自JS的调用。 – dbf

+0

你确定你没有在FastCGI中使用多线程? (如果您设置FCGI_MAX_CONNS = 1,FCGI_MAX_REQS = 1,FCGI_MPXS_CONNS = 0,那么您可以确保只使用单个线程,独立于您使用的fastcgi实现:[FastCGI规范](http://www.fastcgi.com/drupal/node/6?q = node/22))然后,我建议记录进程标识以查看它是否只能通过相同进程或仅通过不同进程擦除。 (在日志格式字符串或“os.getpid()”函数中使用“%(process)d”。) – hynekcer

回答

4

的方式来调试这个问题,我将继承标准的Django会话中间件(或任何您目前正在使用):

django.contrib.sessions.middleware.SessionMiddleware

,敷process_request和(可能更重要的是)process_response在一些额外的日志。然后在MIDDLEWARE_CLASSES中安装您的子类会话中间件,而不是股票Django。

您也可以验证session.save()实际上是否已经通过尝试读回来进行了更改。这可能是问题在于会话状态序列化,并且它在您试图存储的特定键或值上失败。

这些都不能解决您的问题,但它可以帮助您确定发生了什么。

4

正如@Steve Mayne所提到的那样,在会话中间件和会话模型保存方法上进行一些日志记录会很好。这是我开始的事情。

另外我想说这可能是一个数据库相关的问题,特别是如果你使用MySQL数据库后端会话。您可以检查日志以了解数据库锁定和其他并发问题。之前我必须处理类似的问题,解决方案很明确:优化和额外的性能。

如果您有一些特定的应用程序中间件,可以检查干扰Django会话的功能。如果执行不当,这种并行操作可能会导致问题。

我会做的另一件事是升级到Django的最新稳定版本并迁移到mod_wsgi设置。