Django,mod_python,apache和古怪的会话

时间:2008-10-03 11:10:04

标签: python django apache session mod-python

我在Linux机器上通过Apache上的mod_python运行Django。我有一个自定义身份验证后端,以及需要对所有页面进行身份验证的中间件,静态内容除外。

我的问题是,在我登录后,我仍然会不时地随机获取登录屏幕。在我看来,每个apache进程都有自己的python进程,而后者又拥有自己的内部进程。因此,只要我通过我登录的相同流程获得服务,一切都很好,花花公子。但是,如果我的请求由不同的apache进程提供,我将不再进行身份验证。

我已经检查了我用FireBug发送的HTTP标头,每次都是相同的,即。相同的cookie。

这是一个已知问题,是否有解决方法/修复程序?

编辑:我有一个显示大量生成图像的页面。其中一些不会显示。这是因为它们太落后于身份验证中间件,所以他们将随机设置登录图像。但是,刷新此页面足够多次,它最终会起作用,这意味着所有进程都能识别我的会话。

5 个答案:

答案 0 :(得分:2)

您对Apache如何处理流程是正确的,有时您将获得不同流程的服务。当您对网站进行更改时,您可以看到这一点;新流程将获取更改,但旧流程将为您提供旧网站。为了获得一致性,您必须重新启动Apache。

假设重新启动无法解决问题,我猜它会在“自定义身份验证后端”中存储部分身份验证在内存中(对于Web服务器来说效果不佳)。我会尝试在您的Apache配置中将MaxRequestsPerChild设置为1并查看您是否仍然获得登录屏幕。如果你这样做,某些东西存储在内存中,也许某个模型没有被保存?

希望有所帮助!

P.S。出于好奇,您为什么要使用自定义身份验证后端和中间件来确保用户已登录?看来Django的contrib.auth和@login_required会更容易......

答案 1 :(得分:0)

您是否有标准的数据库驱动会话?是否在设置中启用了缓存?

答案 2 :(得分:0)

我强烈建议你不要将MaxRequestsPerChild设置为1,因为这会导致很多开销,因为每个进程都会被终止,并且会对每个请求重新生成。

您使用apach preform MPM还是工作者MPM?

看一下可能会给你一些帮助的http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs

答案 3 :(得分:0)

如果您使用某些全局变量来保存自定义身份验证会话的数据,则需要将其更改为使用文件,数据库或memcached。如上所述,mod_python启动了几个进程,它们之间没有共享内存。

我建议使用memcached,也可以使用cookie来存储会话ID或将其作为GET参数传递,以便以后您可以轻松地从缓存中提取会话数据。

答案 4 :(得分:0)

如何确保在Apache重启(或停止和启动)后不会清除会话?

因为当我升级我的源代码并重新启动Apache时,我刷新了网页,我必须再次登录。会话丢失了。

会话存储在Memcache中。不知道如何以及为何清除它。如何保留会话以便用户在apache重启后无需登录?