我正在使用web.py
将我的mod_wsgi
应用从其内置服务器移植到Apache2。一切都很好,代码执行,会话除外。
首先,请注意会话与旧服务器一起正常工作。我正在测试如下:我渲染一个名为layout
的页面,其中包含行
$session
${'loggedIn' in session}
由于session
(web.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
中)。为什么不是一个谜。
答案 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
我删除了,因为它只是为文档中的内置服务器提供的。