【问题标题】:Django, mod_python, apache and wacky sessionsDjango、mod_python、apache 和古怪的会话
【发布时间】:2010-09-15 01:07:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 运行一段时间后,事情似乎更稳定了。但是我不喜欢这是多么不稳定。也许我需要重置 apache 几次并让它运行几分钟,然后才能正常工作。

标签: python django apache session mod-python


【解决方案1】:

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

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

会话存储在 Memcache 中。不知道它是如何以及为什么被清除的。 apache重启后如何保留session,让用户不用登录?

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      您使用的是 apaches preform MPM 还是 worker MPM?

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

      【讨论】:

        【解决方案4】:

        您对 Apache 处理进程的方式是正确的,有时您会得到另一个进程的服务。当您对您的网站进行更改时,您可以看到这一点;新流程将接受更改,但旧流程将为您提供旧站点。要获得一致性,您必须重新启动 Apache。

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

        希望有帮助!

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

        【讨论】:

        • 我需要针对活动目录进行身份验证,因此需要我自己的身份验证后端。没有任何东西存储在内存中。我没有使用@login_required,因为这是用于外部可用的 Intranet,我不相信自己记得将其放在所有视图上
        • 将 MaxRequestsPerChild 设置为 1 有什么作用?
        • 抱歉,没能测试到,现在我要到星期一才能测试。至少感谢您的建议,我会尝试一下。
        【解决方案5】:

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

        【讨论】:

        • 标准会话和基于文件的会话出现相同错误。未启用缓存。
        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 2011-03-11
        相关资源
        最近更新 更多