下面我提供了一个代码示例,它只使用来自Redis的数据响应HTTP GET请求:
请求: http://example.com:8888/?auth=zefDWDd5mS7mcbfoDbDDf4eVAKb1nlDmzLwcmhDOeUc
回复: get: u'"True"'
此代码的目的是充当REST服务器(这就是我使用lazyConnectionPool的原因)响应请求,并使用Redis中的数据(读/写)。
我需要做什么:
我尝试了多种方法(包括来自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 :(得分: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
但是,您需要了解有关将inlineCallbacks
与twisted.web
合并的更多信息(您应该查找该主题SO questions)。
关于问题2:
如果不使用inlineCallbacks
,交易真的很难看。 txredisapi homepage上有一个示例,使用inlineCallbacks
显示它。