与Apache2的`web.py`会话

时间:2014-08-17 14:50:52

标签: python apache mod-wsgi web.py

问题:

我正在使用web.py将我的mod_wsgi应用从其内置服务器移植到Apache2。一切都很好,代码执行,会话除外。

首先,请注意会话与旧服务器一起正常工作。我正在测试如下:我渲染一个名为layout的页面,其中包含行

$session
${'loggedIn' in session}

由于sessionweb.sessions.Session)初始化为initializer={'loggedIn' : False},我希望第二行始终呈现为" True"。这与默认服务器有关。

然而,在带有mod_wsgi的Apache2上,情况并非如此。如果我重新启动apache,那么它呈现为True,但后续刷新页面呈现为False。

我了解有时cookie_path可能是罪魁祸首,但已将其设置为/,并且不确定其他问题是什么。

代码:

/etc/apache2/apache2.conf

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias / /var/www/myapp/webUtils.py/
AddType text/html .py
<Directory /var/www/myapp>
        Order deny,allow
        Allow from all
</Directory>

/var/www/myapp/webUtils.py

import sys,os
abspath = os.path.dirname(__file__) or '.'
sys.path.append(abspath)
os.chdir(abspath)

import web
(...)

## The configuration for the sessions (this function just reads in 
## the file and turns it into a dictionary).
session_configuration = config.getConfiguration('config/sessions.cfg')

for i in session_configuration:
  web.config.session_parameters[i] = session_configuration[i]

web.config.debug = False

app = web.application(urls,globals(),autoreload=False)

session = web.session.Session(app, 
                              web.session.DiskStore('/home/robert/sessions'),
                              initializer={'loggedIn' : False})

render = web.template.render('templates',
                             globals={'session':session},
                             base='layout')

# Get the WSGI stuff
application = app.wsgifunc()

config/sessions.cfg

timeout : 60*10
secret_key : "stuff"
cookie_name : "someName"
cookie_path : "/"

编辑:更新

通过运行详尽的测试,我发现调用webUtils.session._load()作为GET中的第一行可以解决整个问题。因此我假设_processor的{​​{1}}未被调用(即使它在Session中)。为什么不是一个谜。

2 个答案:

答案 0 :(得分:0)

您正在使用多进程配置,因此无法依赖I内存会话缓存,因为后续请求可以转到不同的进程。此外,由于使用了mod_wsgi的嵌入模式,如果Apache认为不再需要它们,它可以决定关闭你的进程。

您需要确保使用数据库进行会话缓存。

替代使用mod_wsgi守护程序模式,默认为单个进程。

答案 1 :(得分:0)

终于找到了问题。它与多进程有关,但最终导致创建一个钩子的Session对象(因此每次都被加载)与我的页面代码看到的对象不同。因此,如果我在每个load语句中saved编辑并GET我的会话并删除了挂钩,则一切正常。

要解决这个问题,我只需要撤消我做出的假设并恢复代码

if web.config.get('_session') is None:
    session = web.session.Session(app, web.session.DiskStore('sessions'), {'count': 0})
    web.config._session = session
else:
    session = web.config._session
我删除了

,因为它只是为文档中的内置服务器提供的。