Twisted Cyclone - 请求完成后如何写入redis

时间:2012-05-14 10:32:58

标签: python twisted cyclone

以下是我的基本处理程序。我只想服务一个图像,在请求完成后,我想写入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)

2 个答案:

答案 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):
    ...