【发布时间】:2013-06-15 11:09:16
【问题描述】:
我有以下两个用于 web.py 设置的处理程序:
class count1:
def GET(self):
s.session.count += 1
return str(s.session.count)
class count2:
def GET(self):
s.session.count += 1
yield str(s.session.count)
应用运行在 web.py 自带的 cherrypy (app.run()) 或 gevent 服务器上。
urls = (
"/count1", "count.count1",
"/count2", "count.count2",
)
session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'count': 0})
s.session = session
app = web.application(urls, locals())
print "Main: setting count to 1"
from gevent.wsgi import WSGIServer
if __name__ == "__main__":
usecherrypy = False
if usecherrypy:
app.run()
else: # gevent wsgiserver
wsgifunc = app.wsgifunc()
server = WSGIServer(('0.0.0.0', 8080), wsgifunc, log=None)
server.serve_forever()
会话在 count1 情况下工作正常,但在 count2 情况下并非总是如此。在第一次加载 /count2 的页面时,计数器会增加一次,但之后刷新不会增加会话中的计数器,即永远不会保存对会话的更新。这里有什么问题?
从 pypi 安装的 Webpy 或从 github 安装的最新 Webpy 在这种情况下表现相同。
深入研究代码,实际原因似乎是,当处理程序使用yield时,它只是被调用返回生成器对象,然后从所有封闭处理器返回(例如Session._processor调用_save在 finally 块中)。 Web.py 确保生成器在将数据返回给客户端之前完全展开,但展开过程毕竟是处理器,与普通函数处理程序相比,这是完全不同的行为。
所以问题是:对此是否有任何修复或解决方法(除了手动调用 Session._save)?
提前感谢您的任何回答!
【问题讨论】: