2008-10-03 47 views
1

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

我的问题是,我登录后,我仍然会随机获得登录屏幕的一次又一次。在我看来,每个apache进程都有它自己的python进程,而这个进程又拥有自己的内部进程。所以只要我通过我登录的同一个进程获得服务,一切都很好,并且很棒。但是如果我的请求被不同的apache进程提供服务,我不再进行身份验证。

我检查了我用FireBug发送的HTTP标头,它们每次都是相同的,即。同一个cookie。

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

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

+0

运行一段时间后,事情似乎更加稳定。但我不喜欢这是多么不稳定。也许我需要重置Apache几次,让它运行几分钟,然后才能一直工作。 – Staale 2008-10-03 11:39:43

回答

0

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

+0

与基于标准和基于文件的会话相同的错误。未启用缓存。 – Staale 2008-10-03 12:21:34

2

对于Apache如何处理这些流程是正确的,有时候您将得到不同的流程。您可以在对网站进行更改时看到此信息;新的流程将会改变,但旧的流程会给你旧的网站。为了获得一致性,您必须重新启动Apache。

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

希望有帮助!

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

+0

我需要对活动目录进行身份验证,因此我自己的身份验证后端。没有内容存储在内存中。我没有使用@login_required,因为这是针对外部可用的内部网,我不相信自己记得把它放在所有视图上 – Staale 2008-10-03 12:23:35

0

,您需要更改此为使用文件,数据库或者memcached的。如上所述,mod_python启动的进程很少,它们之间没有共享内存。

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

0

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

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

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