下面是我的基本处理程序。我只想为一个镜像提供服务,在请求完成后,我想写到redis,但是当我运行下面的代码时,on_finish没有被调用。
import cyclone.web
import cyclone.redis
from twisted.internet import defer
from twisted.internet import reactor
tt = cyclone.redis.lazyConnectionPool()
class PixelHandler(cyclone.web.RequestHandler):
@cyclone.web.asynchronous
def get(self):
qs = qs_decode(self.request.query)
self.set_header('Content-Type', 'image/gif')
self.write(pixel)
redisPixelWrite(remote_ip)
#self.finish()
def on_finish(self):
t = yield tt.multi()
yield t.set('key', 'value')
r = yield t.commit()
print "commit=", repr(r)发布于 2012-05-29 16:18:41
除非调用了self.finish(),否则不会调用on_finish。我相信你已经知道了。本例中的问题是on_finish()不支持defer.inlineCallbacks (您还没有用它修饰您的on_finish()方法,但是这样做没有什么帮助)。
我认为重写on_finish()以使用普通的老式延迟将会使其工作。尝试如下所示:
def on_finish(self):
tt.multi().addCallback(
lambda t: t.set('key', 'value').addCallback(
t.commit()))一种更好的方法是用defer.inlineCallbacks()修饰get()方法,并将on_finish()的主体移动到其中。
发布于 2012-06-11 13:58:25
当前版本的cyclone支持用inlineCallbacks修饰on_finish。因此,修复代码很容易:
@defer.inlineCallbacks
def on_finish(self):
...https://stackoverflow.com/questions/10581659
复制相似问题