【问题标题】:twisted Get response data at clienttwisted 在客户端获取响应数据
【发布时间】:2014-08-15 16:14:53
【问题描述】:

我关注了这个tutorial,但我不知道如何从服务器获取响应数据。

class Service(Resource):
    def render_POST(self, request):
        return 'response message'

我知道响应数据会显示在客户端

 def dataReceived(self, bytes):
        if self.remaining:
            display = bytes[:self.remaining]
            print 'Some data received:'
            print display
            self.remaining -= len(display)

如何从服务器获取返回的消息并将其存储到变量中?

【问题讨论】:

    标签: python twisted twisted.web twisted.client


    【解决方案1】:

    只需让dataReceived 将display 存储在一个实例变量中,并在每次调用dataReceived 时附加到它。然后,一旦调用了connectionLost,你就知道你得到了完整的响应。

    class BeginningPrinter(Protocol):
        def __init__(self, finished):
            self.finished = finished
            self.remaining = 1024 * 10
            self.total_response = ""  # This will store the response.
    
        def dataReceived(self, bytes):
            if self.remaining:
                display = bytes[:self.remaining]
                self.total_response += display  # Append to our response.
                self.remaining -= len(display)
    
        def connectionLost(self, reason):
            print 'Finished receiving body:', reason.getErrorMessage()
            print 'response is ',self.total_response
            self.finished.callback(self.total_response)
    

    在完整示例的上下文中:

    from pprint import pformat
    
    from twisted.internet import reactor
    from twisted.internet.defer import Deferred
    from twisted.internet.protocol import Protocol
    from twisted.web.client import Agent
    from twisted.web.http_headers import Headers
    
    class BeginningPrinter(Protocol):
        def __init__(self, finished):
            self.finished = finished
            self.remaining = 1024 * 10
            self.total_response = ""  # This will store the response.
    
        def dataReceived(self, bytes):
            if self.remaining:
                display = bytes[:self.remaining]
                self.total_response += display  # Append to our response.
                self.remaining -= len(display)
    
        def connectionLost(self, reason):
            print 'Finished receiving body:', reason.getErrorMessage()
            print 'response is ',self.total_response
            self.finished.callback(self.total_response)  # Executes all registered callbacks
    
    def handle_result(response):
        print("Got response {}".format(response)
    
    agent = Agent(reactor)
    d = agent.request(
        'GET',
        'http://example.com/',
        Headers({'User-Agent': ['Twisted Web Client Example']}),
        None)
    
    def cbRequest(response):
        print 'Response version:', response.version
        print 'Response code:', response.code
        print 'Response phrase:', response.phrase
        print 'Response headers:'
        print pformat(list(response.headers.getAllRawHeaders()))
        finished = Deferred()
        finished.addCallback(handle_result)  # handle_result will be called when the response is ready
        response.deliverBody(BeginningPrinter(finished))
        return finished
    d.addCallback(cbRequest)
    
    def cbShutdown(ignored):
        reactor.stop()
    d.addBoth(cbShutdown)
    
    reactor.run()
    

    【讨论】:

    • 谢谢 dano,但是如果我想将数据存储在BeginningPrinter 类之外的变量中怎么办?我的意思是,你得到的数据还在那个类里面。
    • @coderkisser 这就是finished Deferred 的用途。我已经扩展了我的答案以进行演示。
    • 我仍然无法获取变量中的数据,因为您将其获取到函数中。我需要类似的东西:message = handle_result()。请提供帮助。
    • @coderkisser 为什么需要它?使用 twisted 编写的程序的组织方式与常规程序不同。对响应做某事的“扭曲”方式是注册一个回调。因为整个程序在反应堆中运行,所以用其他任何方式都没有任何意义。
    • 好的,我明白了。再次感谢。
    猜你喜欢
    • 2012-07-18
    • 2023-03-03
    • 1970-01-01
    • 2011-12-27
    • 2020-12-25
    • 1970-01-01
    • 2012-02-22
    • 2018-12-02
    • 2017-04-23
    相关资源
    最近更新 更多