我在Linux机器上通过Apache上的mod_python运行Django。我有一个自定义身份验证后端,以及需要对所有页面进行身份验证的中间件,静态内容除外。
我的问题是,在我登录后,我仍然会不时地随机获取登录屏幕。在我看来,每个apache进程都有自己的python进程,而后者又拥有自己的内部进程。因此,只要我通过我登录的相同流程获得服务,一切都很好,花花公子。但是,如果我的请求由不同的apache进程提供,我将不再进行身份验证。
我已经检查了我用FireBug发送的HTTP标头,每次都是相同的,即。相同的cookie。
这是一个已知问题,是否有解决方法/修复程序?
编辑:我有一个显示大量生成图像的页面。其中一些不会显示。这是因为它们太落后于身份验证中间件,所以他们将随机设置登录图像。但是,刷新此页面足够多次,它最终会起作用,这意味着所有进程都能识别我的会话。
答案 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重启后无需登录?