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

django会话的棘手问题:有时会删除会话信息,django,django-sessions,Django,Django Sessions,在我的应用程序中,django会话有一个奇怪的bug:用户的会话信息有时会被删除(大约10次,每天20000次)。我通过日志文件跟踪它:在A页有用户会话的信息,在它提交表单之后,在下一页他的会话是空的。我尝试了两种类型的存储:memcached+db和db only,这两种类型都有问题。我试图重现这些场景,但正如我所说的,所有的工作都如预期的那样,这种情况很少发生。我还检查了这个问题对于不同的用户是否存在,对于他们来说,不是每次都重现。我不知道如何抓住根本原因,也不知道这里还有什么描述。如果有人

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


UPD:我检查并发现,在两个连续请求期间,uses的会话密钥没有更改,在第一个请求中有一个实际的会话状态,在第二个会话中,变量与empty关联。

为了调试这个问题,我将对标准Django会话中间件(或您当前使用的任何中间件)进行子类化:

django.contrib.sessions.middleware.SessionMiddleware

并将
process\u request
和(可能更重要的是)
process\u response
包装在一些额外的日志中。然后将您的子类会话中间件安装在
中间件\u类中,而不是普通的Django类中

您还可以通过尝试回读来验证
session.save()
是否确实提交了其更改。问题可能在于会话状态序列化,而您试图存储的特定键或值失败


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

正如@Steve Mayne提到的,最好在会话中间件和会话模型保存方法上进行一些日志记录。这是我首先想到的

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

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


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

您是否使用可以生成并发请求的javascript,以便两者都可以修改会话?@hynekcer,JS调用中不会更新会话。您确定在FastCGI中不使用多线程吗?(如果设置FCGI_MAX_CONNS=1、FCGI_MAX_REQS=1、FCGI_MPXS_CONNS=0,则可以确保仅使用单线程,独立于所使用的fastcgi实现:)然后我建议记录进程id,以查看它是否只能由同一进程或不同的进程擦除。(在日志格式字符串中使用“%(进程)d”或“os.getpid()”函数。)由于它与您的代码(fi.
submit
action)相关,您应该提供一些信息:如果submit与会话数据或会话密钥相关,等等。