Twisted Cyclone如何在请求后写入redis

2024-04-29 00:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: fromimportselfrediswebondeftwisted
2条回答

除非调用了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()方法,并将{}的主体移动到其中。在

cyclone的当前版本支持用inlineCallbacks装饰{}。因此,修复代码很容易:

@defer.inlineCallbacks
def on_finish(self):
    ...

相关问题 更多 >