2012-05-14 78 views
2

下面是我的基本處理程序。我只想服務器映像,並在請求完成後,我想寫入到redis,但是當我運行下面的代碼時,on_finish不會被調用。Twisted Cyclone - 如何在請求完成後寫入redis

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) 

回答

1

on_finish將不會被調用,除非self.finish()被調用。我相信你已經知道了。 在這種情況下的問題是,on_finish()不支持defer.inlineCallbacks(您還沒有用它來裝飾on_finish()方法,但這樣做不會有幫助)。

我想重寫on_finish()使用普通的舊deferreds將會使這項工作。嘗試是這樣的:

def on_finish(self): 
     tt.multi().addCallback(
       lambda t: t.set('key', 'value').addCallback(
        t.commit())) 

一個更好的解決辦法是與defer.inlineCallbacks()來裝飾你的get()方法和移動的on_finish()身體進去。

1

當前旋風版本支持裝潢on_finishinlineCallbacks。因此,固定你的代碼很簡單:

@defer.inlineCallbacks 
def on_finish(self): 
    ... 
相關問題