2016-05-30 44 views
0

我想做一个GET请求来检查返回码是否是我期望的。这个请求发生在通用延迟链的addCallback所调用的函数内部,如下面的代码所示。如何做一个HTTP请求延迟在另一个(级联延期)?

我的具体问题如果:如何使行的返回-D-到达行-E-?

似乎从未调用回调函数“cbResponse”(行-D-)。我的第一次尝试是请求并返回到回调链请求的结果(行-A-)。它失败了,因为延期对象没有属性结果。 第二次尝试(行-B-),返回延迟对象本身。它也不会返回结果。 第三次尝试(行-C-),whas返回任何东西,但它显然没有请求的响应代码。

非常感谢!

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 Agent这需要运行反应堆正常工作,请参阅文档链接的例子。如果启动Twisted reactor,您的代码示例将可以正常工作。

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

Twisted Treq是建立在代理顶部一个有趣的框架,它承诺给你的python-请求像扭曲的异步HTTP客户端API。

+0

感谢@Pawel您的回答。但是这种方法还不行。也许我的问题不清楚。我现在做了一些调整。从回调链中的函数需要做一个get请求并检查http返回码。根据这段代码,我想从原始回调链中做出特定的回报。我的缺点是get请求的回调函数没有被调用。 –

0

您正在同步调用tst.deferredChain()并尝试读取其中的d.result,这是不正确的。正确的解决方案是让它返回一个延迟,并附上一个回调。

+0

Hi @ pinturic!感谢您的回答。如果我理解的很好,我需要将我的函数deferredChain()的同步调用添加为另一个延迟对象的回调。我试图用下面的代码来实现这个功能:012A'defA = defer.Deferred()' 'defA.addCallback(Test.deferredChain)' 'defA.callback(“success”)' 'rtn = defA.result' 新的行为似乎是一个循环,在控制台没有响应。我不知道现在发生了什么。这是我的问题的正确解决方案吗?我忘了什么? –