我有以下两个用于 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 的行为相同。
深入代码后,实际原因似乎是,当handler使用yield时,它只是被调用以返回生成器对象,然后从所有封闭的处理器中返回(例如Session._processor在finally中调用_save堵塞)。Web.py 确保在将数据返回给客户端之前完全展开生成器,但展开过程毕竟是处理器,与普通函数处理程序相比,这是完全不同的行为。
所以问题是:对此是否有任何修复或解决方法(除了手动调用 Session._save )?
提前感谢您的任何答案!