2

以下は私の基本的なハンドラーです。イメージをサーバーに送信したいだけで、リクエストが完了した後、redis に書き込みたいのですが、以下のコードを実行すると、on_finish が呼び出されません。

import cyclone.web
import cyclone.redis 
from twisted.internet import defer
from twisted.internet import reactor
tt = cyclone.redis.lazyConnectionPool()
class PixelHandler(cyclone.web.RequestHandler):
    @cyclone.web.asynchronous
    def get(self):
        qs = qs_decode(self.request.query)
        self.set_header('Content-Type', 'image/gif')
        self.write(pixel)
        redisPixelWrite(remote_ip)
        #self.finish()
    def on_finish(self):
        t = yield tt.multi()
        yield t.set('key', 'value')
        r = yield t.commit()
        print "commit=", repr(r)
4

2 に答える 2

1

サイクロンの現在のバージョンは、での装飾on_finishをサポートしていinlineCallbacksます。したがって、コードの修正は簡単です。

@defer.inlineCallbacks
def on_finish(self):
    ...
于 2012-06-11T05:58:25.173 に答える
1

on_finishが呼び出されない限り、呼び出されませんself.finish()。あなたはすでにそれを知っていると確信しています。この場合の問題は、 on_finish() がサポートしていないdefer.inlineCallbacksことです (メソッドを装飾していませんon_finish()が、そうしても役に立ちません)。

on_finish()単純な古い deferred を使用するように書き直すと、これが機能すると思います。次のようなことを試してください:

    def on_finish(self):
        tt.multi().addCallback(
                lambda t: t.set('key', 'value').addCallback(
                    t.commit()))

より良いアプローチは、get()メソッドを装飾defer.inlineCallbacks()し、本体をその中に移動するon_finish()ことです。

于 2012-05-29T08:18:41.460 に答える