Django,mod_python,apache和古怪的会话

时间:2020-03-06 15:04:11  来源:igfitidea点击:

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

我的问题是,登录后,我仍然会一次又一次地随机获得登录屏幕。在我看来,每个apache进程都有其自己的python进程,而python进程又具有其自己的内部结构。因此,只要按照登录时的相同流程进行服务,一切都会好起来的。但是,如果我的请求由另一个apache进程处理,则不再通过身份验证。

我已经检查了通过FireBug发送的HTTP标头,并且每次都相同。相同的cookie。

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

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

解决方案

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

我们对Apache如何处理流程是正确的,有时我们会得到其他流程的服务。更改网站时,我们会看到此信息。新流程将接管更改,但旧流程将为我们提供旧站点。为了保持一致性,我们必须重新启动Apache。

假设重新启动不能解决问题,我想这是"自定义身份验证后端"中将身份验证的一部分存储在内存中的问题(对于Web服务器,它工作得不太好)。我会尝试在Apache配置中将MaxRequestsPerChild设置为1,看看是否仍能看到登录屏幕。如果这样做,那么某些东西正在存储在内存中,也许模型没有被保存?

希望对我们有所帮助!

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

我强烈建议我们不要将MaxRequestsPerChild设置为1,因为那样会导致大量开销,因为每个进程都会被杀死,并随每个请求重新生成。

我们是否正在使用Apaches瓶坯MPM或者工人MPM?

看看http://docs.djangoproject.com/zh-CN/dev/howto/deployment/modpython/?from=olddocs可能会对我们有所帮助

如果我们使用一些全局变量来保存自定义身份验证会话的数据,则需要将其更改为使用文件,数据库或者内存缓存。如上所述,mod_python启动很少的进程,并且它们之间没有共享内存。

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