2012-05-07 1 views
1

다음은 redis에 쓰기 요청에서 비 차단 방법으로 다시 시도하는 코드입니다. 또한 아래 오류가 발생합니다. 500 오류입니다. 나는 사이클론과 함께 배송 된 txredisapi에 대한 문서를 이해하지 못합니다.초보자가 트위스트 및 사이클론에 - 간단한 요청을 받기 위해 redis 콜백을 얻는 방법

redisPixelWrite(remote_ip).addcallback() 

인상 AttributeError : 그것은

import cyclone.web 
import sys 
from twisted.internet import reactor 
from twisted.python import log 
import cyclone.redis as redis 
from twisted.internet import defer 
from twisted.internet import reactor 

@defer.inlineCallbacks 
def redisPixelWrite(remote_ip): 
    rc = yield redis.Connection() 
    yield rc.set("foo", 'itwodasdfred') 
    v = yield rc.get("foo") 
    print "foo:", v 
    yield rc.disconnect() 

class Application(cyclone.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r"/", MainHandler), 
     ] 
     settings = {"xheaders": True,"static_path": "./static"} 
     cyclone.web.Application.__init__(self, handlers, **settings)  

class MainHandler(cyclone.web.RequestHandler): 
    def get(self): 
     remote_ip = self.request.remote_ip 
     redisPixelWrite(remote_ip).addcallback() 
     self.set_header('Content-Type', 'text/html') 
     self.write(remote_ip) 

def main(): 
    log.startLogging(sys.stdout) 
    reactor.listenTCP(8051, Application(), interface="127.0.0.1") 
    reactor.run() 

if __name__ == "__main__": 
    main() 


2012-05-07 21:12:10+0800 [-] Log opened. 
2012-05-07 21:12:10+0800 [-] Application starting on 8051 
2012-05-07 21:12:10+0800 [-] Starting factory <__main__.Application instance at 0x228af38> 
2012-05-07 21:12:14+0800 [HTTPConnection,0,127.0.0.1] Starting factory <cyclone.redis.RedisFactory instance at 0x261a680> 
2012-05-07 21:12:14+0800 [HTTPConnection,0,127.0.0.1] Uncaught exception GET/(127.0.0.1) :: HTTPRequest(protocol='http', host='127.0.0.1:8051', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1', body='', headers={'Connection': 'keep-alive', 'Accept-Language': 'en-us,en;q=0.5', 'Accept-Encoding': 'gzip, deflate', 'Cache-Control': 'max-age=0', 'Host': '127.0.0.1:8051', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0'}) 
2012-05-07 21:12:14+0800 [HTTPConnection,0,127.0.0.1] 500 GET/(127.0.0.1) 2.07ms 
2012-05-07 21:12:14+0800 [RedisProtocol,client] foo: itwodasdfred 
2012-05-07 21:12:14+0800 [RedisProtocol,client] Stopping factory <cyclone.redis.RedisFactory instance at 0x261a680> 
+0

"하지만 앱은 무엇입니까? –

답변

1

이 줄을 레디 스에 쓸 수 있지만 응용 프로그램 않았다. 아마도 Cyclone에 대한 버그 리포트를 제출해야합니다. 아마도 이것이 어딘가에보고되었을 것입니다 (또는 예외가보고 될 로그를 실제로보고 있는지 확인하십시오).

redisPixelWriteinlineCallbacks으로 장식되어 있기 때문에 Deferred을 반환합니다. Deferred에는 addcallback 방법이 없습니다. addCallback 방법이 있습니다. 사용하려는 것으로 생각됩니다. 0이 아닌 적어도 하나의 인수가 필요하므로이를 수정해야합니다.

2

코드에서 몇 가지를 놓쳤습니다.

  1. get 기능은 inlineCallbacks로 장식 할 수 있어야하며 yield redisPixelWrite(remote_ip)
  2. 당신은 아마 모든 요청에 ​​레디 스하는 새로운 연결을하지 않으려한다. 영구 연결 풀을 설정하고 새 요청에 다시 사용하는 것이 더 효율적입니다. 모든 Connection 방법의 기본 동작을 중지하거나 다시 시작 레디 스해야 자동 재 연결에 있음을

    import cyclone.redis 
    import cyclone.web 
    import sys 
    
    from twisted.python import log 
    from twisted.internet import defer 
    from twisted.internet import reactor 
    
    
    class RedisMixin(object): 
        redis = None 
    
        @classmethod 
        def setup(self): 
         RedisMixin.redis = cyclone.redis.lazyConnectionPool() 
    
    
    class Application(cyclone.web.Application): 
        def __init__(self): 
         handlers = [(r"/", MainHandler)] 
         RedisMixin.setup() 
         settings = {"debug": True, "xheaders": True, "static_path": "./static"} 
         cyclone.web.Application.__init__(self, handlers, **settings) 
    
    
    class MainHandler(cyclone.web.RequestHandler, RedisMixin): 
        @defer.inlineCallbacks 
        def get(self): 
         try: 
          yield self.redis.set("foo", self.request.remote_ip) 
          ip = yield self.redis.get("foo") 
         except: 
          raise cyclone.web.HTTPError(503) # Service Unavailable 
         else: 
          self.set_header('Content-Type', 'text/html') 
          self.write(ip) 
    
    
    def main(): 
        log.startLogging(sys.stdout) 
        reactor.listenTCP(8051, Application(), interface="127.0.0.1") 
        reactor.run() 
    
    if __name__ == "__main__": 
        main() 
    

    참고 :

이 당신을 위해 무엇을 찾고있는 아마. 연결이 다시 설정되고 재발신과의 통신이 재개 될 때까지 HTTP 503 (서비스 사용 불가)로 응답합니다.