首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Twisted Cyclone -如何在请求完成后写入redis

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

Stack Overflow用户
提问于 2012-05-14 18:32:58
回答 2查看 265关注 0票数 2

下面是我的基本处理程序。我只想为一个镜像提供服务,在请求完成后,我想写到redis,但是当我运行下面的代码时,on_finish没有被调用。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2012-05-29 16:18:41

除非调用了self.finish(),否则不会调用on_finish。我相信你已经知道了。本例中的问题是on_finish()不支持defer.inlineCallbacks (您还没有用它修饰您的on_finish()方法,但是这样做没有什么帮助)。

我认为重写on_finish()以使用普通的老式延迟将会使其工作。尝试如下所示:

代码语言:javascript
复制
    def on_finish(self):
        tt.multi().addCallback(
                lambda t: t.set('key', 'value').addCallback(
                    t.commit()))

一种更好的方法是用defer.inlineCallbacks()修饰get()方法,并将on_finish()的主体移动到其中。

票数 1
EN

Stack Overflow用户

发布于 2012-06-11 13:58:25

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

代码语言:javascript
复制
@defer.inlineCallbacks
def on_finish(self):
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10581659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档