1

以下は、get リクエストから redis に書き込むための非ブロッキング メソッドで redis を試行するための私のコードです。また、以下は私が得るエラーです。500 エラーです。サイクロンに同梱されている txredisapi のドキュメントがわかりません。redisに書き込みましたが、アプリ

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>
4

2 に答える 2

2

コードでいくつかのことを見逃しました。

  1. get関数は で装飾する必要がありinlineCallbacksます。yield redisPixelWrite(remote_ip)
  2. おそらく、すべてのリクエストで redis への新しい接続を作成したくないでしょう。永続的な接続プールを設定して、新しいリクエストで再利用する方が効率的です。

これはおそらくあなたが探しているものです:

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()

すべてのメソッドのデフォルトの動作Connectionは、自動再接続であり、redis を停止または再起動する必要があることに注意してください。接続が再確立されて redis との通信が再開されるまで、HTTP 503 (Service Unavailable) で応答します。

于 2012-06-11T06:38:33.280 に答える
1

この行:

redisPixelWrite(remote_ip).addcallback()

上げAttributeErrorます。おそらく、Cyclone に対してバグ レポートを提出する必要があります。Cyclone はこれをどこかに報告しているはずです (または、例外が報告されるログを実際に見ていることを確認してください)。

redisPixelWriteDeferredで装飾されているため、 はa を返しますinlineCallbacksaddcallbackにはメソッドがありませんDeferred。メソッドがありaddCallback、それがあなたが使いたかったものかもしれません。ただし、ゼロではなく少なくとも 1 つの引数が必要なので、それも修正する必要があります。

于 2012-05-08T12:50:48.177 に答える