django会话的棘手问题:有时会话信息被删除

时间:2012-12-27 22:01:34

标签: django django-sessions

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

UPD:我检查并看到在两次连续请求期间,使用的会话密钥没有改变,第一次请求时有一个实际的会话状态,而第二次会话变量则是空的。

2 个答案:

答案 0 :(得分:4)

作为调试此问题的一种方法,我将继承标准的Django会话中间件(或者您当前正在使用的任何内容):

django.contrib.sessions.middleware.SessionMiddleware

并在一些额外的日志记录中包装process_request和(可能更重要的)process_response。然后在MIDDLEWARE_CLASSES中安装子类会话中间件,而不是Django库存。

您还可以通过尝试将其更改来验证session.save()实际已提交更改。可能问题在于会话状态序列化,并且它在您尝试存储的特定键或值上失败。

这些都无法解决您的问题,但它可能会帮助您确定正在发生的事情。

答案 1 :(得分:4)

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

此外,我想说这可能是一个与数据库相关的问题,特别是如果您正在使用MySQL数据库后端进行会话。您可以检查日志中是否存在数据库锁和其他并发问题。我之前不得不处理类似的问题,解决方案很明确:优化和额外的性能。

如果您有一些特定的应用程序中间件,则可以检查是否存在干扰Django会话的功能。如果没有正确实施,这种并行操作可能会导致问题。

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