8

私は Twisted を初めて使用し、データベースから名前のリストを表示する単純なリソースを作成しようとしています。これが私のコードの一部です:

#code from my ContactResource class
def render_GET(self, request):
    def print_contacts(contacts, request):
        for c in contacts:
            request.write(c.name)
        if not request.finished:
            request.finish()
    d = Contact.find() #Contact is a Twistar DBObject subclass
    d.addCallback(print_contacts, request)
    return NOT_DONE_YET

私の質問は、このメソッドを変更して inlineCallbacks デコレータを使用するにはどうすればよいですか?

4

2 に答える 2

11

render_GETメソッドは を返さない場合がありますDeferred。文字列またはNOT_DONE_YET. で装飾されたメソッドは、inlineCallbacksを返しますDeferredrender_GETしたがって、 で装飾することはできませんinlineCallbacks

もちろん、render_GETを返す関数を含め、 で必要な他の関数を呼び出すことを妨げるものは何もありませんDeferredDeferredを返すのではなく、破棄するだけですrender_GET(もちろん、 がDeferred失敗して起動しないようにしてください。破棄すると、エラー報告が失われる可能性があります...)。

たとえば、次のようになります。

@inlineCallbacks
def _renderContacts(self, request):
    contacts = yield Contact.find() 
    for c in contacts:
        request.write(c.name)
    if not request.finished:
        request.finish()


def render_GET(self, request):
    self._renderContacts(request)
    return NOT_DONE_YET

Twisted で本格的な Web 開発を行う場合は、少なくともtxyogakleinを確認することをお勧めします。それらを使用したくない場合でも、コードを構築し、このようなさまざまな一般的なタスクを実行する方法について、いくつかの良いアイデアが得られるはずです。

于 2013-02-06T17:05:22.950 に答える
-2

編集:twisted.webとinlineCallbacksを組み合わせる方法の例は見つかりませんでしたが、ここに2つの提案があります。最初のものが望ましいですが、それが機能するかどうかはわかりません。

@inlineCallbacks
def render_GET(self, request):
    contacts = yield Contact.find() 
    defer.returnValue(''.join(c.name for c in contacts)


@inlineCallbacks
def render_GET(self, request):
    contacts = yield Contact.find() 
    for c in contacts:
        request.write(c.name)
    if not request.finished:
        request.finish()
    defer.returnValue(NOT_DONE_YET)
于 2013-02-05T17:15:29.817 に答える