1

我有以下两个用于 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 )?

提前感谢您的任何答案!

4

1 回答 1

0

也许它发生是因为 yield 返回一个生成器而不是一个值。

参考:

http://od-eon.com/blogs/calvin/python-yield-versus-return/

Python中的“yield”关键字有什么作用?

于 2013-06-15T17:04:20.690 回答