2012-05-14 2 views
2

다음은 기본적인 처리기입니다. 난 단지 이미지를 서버로 보내고 요청이 완료된 후에 redis에 쓰고 싶지만 아래 코드를 실행하면 on_finish가 호출되지 않는다. self.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가 호출되지 않습니다. 나는 당신이 이미 그것을 알고 있다고 확신합니다. 이 경우 문제는 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() 방법을 장식하고 그것으로 on_finish()의 몸을 이동하는 것입니다.

1

으로 장식하는 현재 버전의 사이클은 inlineCallbacks입니다. 따라서 코드 수정이 쉽습니다.

@defer.inlineCallbacks 
def on_finish(self): 
    ... 
관련 문제