2013-10-12 63 views
2

下面我提供了一種代碼例子僅僅是爲了HTTP GET從Redis的數據請求作出響應:扭曲:使用txredisapi庫勸需要

請求:http://example.com:8888/?auth=zefDWDd5mS7mcbfoDbDDf4eVAKb1nlDmzLwcmhDOeUc 響應:get: u'"True"'

的這段代碼的目的是作爲一個REST服務器(這就是爲什麼我使用lazyConnectionPool)響應請求,並使用來自Redis的數據(讀/寫)。

我需要做的:

  1. 運行多個請求裏面的IndexHandler的render_GET Redis的(如GET,HMGET,SET等)
  2. 潤多在事務內IndexHandler的render_GET請求

我已經嘗試了多種方法來做到這一點(包括來自txredisapi庫的例子),但由於缺乏經驗,沒有做到這一點。你能否就問題1)和2)提供建議。

在此先感謝。

import txredisapi as redis 

from twisted.application import internet 
from twisted.application import service 
from twisted.web import server 
from twisted.web.resource import Resource 


class Root(Resource): 
    isLeaf = False 


class BaseHandler(object): 
    isLeaf = True 

    def __init__(self, db): 
     self.db = db 
     Resource.__init__(self) 


class IndexHandler(BaseHandler, Resource): 
    def _success(self, value, request, message): 
     request.write(message % repr(value)) 
     request.finish() 

    def _failure(self, error, request, message): 
     request.write(message % str(error)) 
     request.finish() 

    def render_GET(self, request): 
     try: 
      auth = request.args["auth"][0] 
     except: 
      request.setResponseCode(404, "not found") 
      return "" 

     d = self.db.hget(auth, 'user_add') 
     d.addCallback(self._success, request, "get: %s\n") 
     d.addErrback(self._failure, request, "get failed: %s\n") 
     return server.NOT_DONE_YET 


# Redis connection parameters 
REDIS_HOST = '10.10.0.110' 
REDIS_PORT = 6379 
REDIS_DB = 1 
REDIS_POOL_SIZE = 1 
REDIS_RECONNECT = True 

# redis connection 
_db = redis.lazyConnectionPool(REDIS_HOST, REDIS_PORT, REDIS_DB, REDIS_POOL_SIZE) 

# http resources 
root = Root() 
root.putChild("", IndexHandler(_db)) 

application = service.Application("web") 
srv = internet.TCPServer(8888, server.Site(root), interface="127.0.0.1") 
srv.setServiceParent(application) 
+0

此代碼看起來不錯。我沒有運行它,但它有什麼問題? – Max

+0

提供的代碼是絕對有效的,並且沒有任何當前實現的問題。我需要的是擴展它:(i)在IndexHandler的render_GET內部向Redis運行多個請求(如GET,HMGET,SET等); (ii)在IndexHandler的render_GET內部的事務中運行多個請求 –

回答

1

關於第一個問題:

有幾個方法可以推廣到製作在一個HTTP請求多個數據庫的請求。

例如,您可以讓多個請求:

d1 = self.db.hget(auth, 'user_add') 
d2 = self.db.get('foo') 

然後你就可以得到一個回調觸發時,所有這些同時請求的是成品(見twisted.internet.defer.DeferredList)。

或者您可以使用inlineCallbacks如果您需要連續請求。例如:

@inlineCallbacks 
def do_redis(self): 
    foo = yield self.db.get('somekey') 
    bar = yield self.db.hget(foo, 'bar') # Get 'bar' field of hash foo 

但是,你需要閱讀更多有關合並inlineCallbackstwisted.web(有SO questions關於這一主題,你應該查找)。

關於問題2:

事務是真難看,而無需使用inlineCallbacks做。在txredisapi homepage有一個示例,它使用inlineCallbacks來顯示它。

+1

感謝@Max,它看起來像我使用'inlineCallbacks'所描述的一樣。我認爲它適用於我,我一定會嘗試使用'DeferredList'解決方案。 –

+0

不客氣,@PavelKlymenko。恕我直言,'DeferredList'可以少量使用,但'inlineCallbacks'在長期運行中值得代碼簡化。 – Max

+0

我認爲你是對的@Max。通過'inlineCallbacks'實現。再次感謝。 –