2016-05-30 8 views
0

私は、リターンコードが私が期待しているものかどうかを確認するGETリクエストを行いたいと思っています。この要求は、一般的な遅延チェーンのaddCallbackによって呼び出される関数内で発生します(下のコードで示されています)。他の内部で遅延されたHTTP要求を取得する方法(カスケード遅延)?

私の具体的な質問は:行の復帰方法-D-は行-E-に到着しますか?

コールバック関数 "cbResponse"(line -D-)が呼び出されないようです。私の最初の試みはリクエストを行い、コールバックチェーンにリクエストの結果を返すことでした(行-A-)。 deferrオブジェクトには属性の結果がないため、失敗します。 2番目のattemp(line -B-)は、遅延オブジェクト自体を返します。結果も返されません。 3つ目のattemp(-C-)は何も返しませんが、明らかに要求の応答コードはありません。

ありがとうございます!あなたは、正常に動作ドキュメントにリンクの例を見るために原子炉を実行している必要がTwisted Agentを使用している

from twisted.web.client import Agent 
from twisted.web.http_headers import Headers 
from twisted.internet import reactor, defer 

class Test (object): 


    @classmethod 
    def getRequest (self, result): 

     print "Function getRequest" 

     agent = Agent(reactor) 

     d2 = agent.request('GET', 
          'http://www.google.com', 
          Headers({'User-Agent': ['Twisted Web Client Example']}), 
          None) 

     d2.addCallback(Test.cbResponse) 

     # 1 st attempt: return the result of d2. Fail: exceptions.AttributeError: Deferred instance has no attribute 'result' 
     return d2.result   # --> line A 

     # 2nd attempt: return only the deferr object d2. Don't fail, but I can't get the result of the above request 
     ### return d2     # --> line B 

     # 3rd attemp: return None (without return). 
            # --> line C 

    @classmethod 
    def cbResponse(response): 

     print 'Function cbResponse %s', response.code 
     # This is the return value I want to pass back to deferredChain function (called at line E) 
     return response.code   # line --> D 

    @classmethod 
    def deferredChain(self): 
     d = defer.Deferred() 

     d.addCallback(Test.getRequest) # line --> E 
     d.callback("success") 

     return d.result     # line --> F 



if __name__ == '__main__': 
    tst = Test() 
    rtn = tst.deferredChain() 
    print "RTN: %s " % rtn 
+0

何が問題なのか、何が問題なのかがはっきりしないので、質問を言い換えてください。 – pinturic

+0

申し訳ありません@pinturic、私は調整しました。今はどうか分かりますか? –

答えて

0

。あなたのコードサンプルは、Twisted reactorを始めるとうまく動作します。

if __name__ == '__main__': 
    tst = Test() 
    rtn = tst.deferredChain() 
    reactor.run() 
    print "RTN: %s " % rtn 

Twisted Treqそれはあなたのツイスト非同期HTTPクライアントのAPIのようなのpython-リクエストを与えることを約束し、エージェントの上に構築された興味深いフレームワークです。

+0

あなたの答えは@Pawelに感謝します。しかし、このアプローチはまだ機能しません。たぶん私の質問は明確ではない。私は今いくつか調整しました。必要は、コールバックチェーン内の関数から、get要求を行い、httpリターンコードをチェックすることです。このコードに応じて、元のコールバックチェーンから特定の戻り値を作りたいと思います。私の難しさは、get要求のコールバック関数が呼び出されないということです。 –

0

tst.deferredChain()を同期的に呼び出して、その中でd.resultを読み取ろうとしていますが、これは正しくありません。正しい解決策は、それを遅延させて返すようにしてコールバックをアタッチすることです。

+0

こんにちは@pinturic!ご回答有難うございます。私がよく理解していれば、私の関数deferredChain()の同期呼び出しを、別の遅延オブジェクトのコールバックとして追加することで置き換える必要があります。私は次のコードでこれを試みました: 'defA = defer.Deferred()' 'defA.addCallback(Test.deferredChain)' 'defA.callback(" success ")' 'rtn = defA.result' 新しい動作はループであり、コンソールでは応答がありません。本当に何が起こっているのか分かりません。これは私の問題の正しい解決策ですか?私が忘れたのは何ですか? –

関連する問題