2013-10-12 25 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'实现。再次感谢。 –