2

下面是我的基本处理程序。我只想提供一个图像,在请求完成后,我想写到 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)
4

2 回答 2

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()到其中。

于 2012-05-29T08:18:41.460 回答
1

当前版本的旋风支持on_finish使用inlineCallbacks. 因此,修复代码很容易:

@defer.inlineCallbacks
def on_finish(self):
    ...
于 2012-06-11T05:58:25.173 回答