以下是我的基本处理程序。我只想服务一个图像,在请求完成后,我想写入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)
答案 0 :(得分:1)
on_finish
,否则不会调用 self.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()))
更好的方法是使用get()
修饰defer.inlineCallbacks()
方法,并将on_finish()
的正文移入其中。
答案 1 :(得分:1)
旋风的当前版本支持使用on_finish
装饰inlineCallbacks
。因此,修复代码很简单:
@defer.inlineCallbacks
def on_finish(self):
...