Twisted:建议使用txredisapi库

时间:2013-10-12 17:39:46

标签: python redis twisted

下面我提供了一个代码示例,它只使用来自Redis的数据响应HTTP GET请求:

请求: http://example.com:8888/?auth=zefDWDd5mS7mcbfoDbDDf4eVAKb1nlDmzLwcmhDOeUc 回复: get: u'"True"'

此代码的目的是充当REST服务器(这就是我使用lazyConnectionPool的原因)响应请求,并使用Redis中的数据(读/写)。

我需要做什么:

  1. 在IndexHandler的render_GET中运行对Redis的多个请求(如GET,HMGET,SET等)
  2. 在IndexHandler
  3. 的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)
    

1 个答案:

答案 0 :(得分: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显示它。