Django、mod_python、Apache与奇怪的会话
我在一台Linux服务器上通过mod_python在Apache上运行Django。我有一个自定义的身份验证后台,还有一个中间件,要求所有页面都需要登录,除了静态内容。
我的问题是,登录后我有时还是会随机看到登录界面。我感觉每个Apache进程都有自己的Python进程,而每个Python进程又有自己的内部状态。所以只要我请求的处理是由我登录时的那个进程来完成,一切都很好。但是如果我的请求被其他Apache进程处理,我就不再登录了。
我用FireBug检查过我发送的HTTP头信息,每次都是一样的,也就是说,cookie是相同的。
这是一个已知的问题吗?有没有解决办法或者修复方法?
补充:我有一个页面显示很多生成的图片。其中一些图片不会显示。这是因为它们在身份验证中间件之后,所以会随机出现一个登录界面。不过,刷新这个页面几次后,它最终会正常显示,这意味着所有进程都能识别我的会话。
5 个回答
你们有没有使用标准的数据库驱动的会话?设置里有没有开启缓存功能?
我强烈建议你不要把 MaxRequestsPerChild 设置为 1,因为这样会导致每次请求时都要杀掉一个进程再重新启动,这样会浪费很多资源。
你是在使用 Apache 的 preform MPM 还是 worker MPM?
可以看看这个链接 http://docs.djangoproject.com/en/dev/howto/deployment/modpython/?from=olddocs,可能会对你有帮助。
你说得对,Apache处理进程的方式确实是这样的,有时候你会被不同的进程服务到。当你对网站进行更改时,新进程会接收到这些更改,而旧进程则会显示旧的网站。为了保持一致性,你需要重启Apache。
假设重启没有解决问题,我猜可能是“自定义认证后端”在内存中存储了一部分认证信息(这对于网络服务器来说效果不太好)。我建议你在Apache配置中把MaxRequestsPerChild
设置为1,然后看看你是否还会看到登录界面。如果还看到,那可能是有东西被存储在内存中,可能是某个模型没有被保存?
希望这些对你有帮助!
附注:出于好奇,为什么你要使用自定义认证后端和中间件来确保用户登录呢?看起来Django的contrib.auth和@login_required会更简单一些……