2016-05-30 9 views
0

Я хочу сделать запрос GET, чтобы проверить, является ли код возврата ожидаемым. Этот запрос встречается внутри функции, вызванной addCallback общей отложенной цепочки, как показано в следующем коде.Как сделать запрос HTTP Получить запрос с отложенным внутри другого (каскадное отсрочка)?

Мой конкретный вопрос, если: Как сделать возврат линии -D- прибывает на линию -E-?

Кажется, что вызывающая функция «cbResponse» (строка -D-) никогда не вызывается. Моя первая попытка заключалась в выполнении запроса и возврате в цепочку обратного вызова результат запроса (строка -A-). Он терпит неудачу, потому что объект deferr не имеет результата атрибута. Второй attemp (строка -B-) был возвращен отложенным объектом. Он также не возвращает результат. Третий attemp (строка -C-), который возвращает что-либо, но, очевидно, не имеет кода ответа запроса.

Большое спасибо!

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.

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

Twisted Treq интересная структура построен на вершине агентов, он обещает дать вам питон-запросы, такие как API для вьющейся HTTP клиента асинхронного.

+0

Спасибо @Pawel за ваш ответ. Но этот подход пока не работает. Может быть, мой вопрос непонятен. Я немного поправил. Потребность заключается в том, что функция внутри цепочки обратного вызова выполняет запрос на получение и проверяет код возврата http. В зависимости от этого кода я хочу сделать конкретный возврат из исходной цепи обратного вызова. Моя проблема заключается в том, что функция обратного вызова запроса получения не вызывается. –

0

Вы вызываете tst.deferredChain() синхронно и пытаетесь прочитать d.result внутри него, и это неверно. Правильное решение позволяет возвратить отложенную и подключить к ней обратный вызов.

+0

Привет @pinturic! Спасибо за Ваш ответ. Если я правильно понял, мне нужно заменить синхронный вызов моей функции deferredChain(), добавив его в качестве обратного вызова другого отложенного объекта. Я попытался сделать это со следующим кодом: 'defA = defer.Deferred()' 'defA.addCallback (Test.deferredChain)' 'defA.callback (« success »)' 'rtn = defA.result' Новое поведение похоже на цикл, без ответа на консоли. Я не знаю, что на самом деле происходит сейчас. Является ли это правильным решением моей проблемы? Что я забыл? –