7

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

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

4

2 回答 2

4

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

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

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

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

于 2012-12-30T23:14:03.543 回答
4

作为调试此问题的一种方法,我将子类化标准 Django 会话中间件(或您当前使用的任何东西):

django.contrib.sessions.middleware.SessionMiddleware

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

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

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

于 2012-12-30T10:13:03.447 回答