2012-08-07 99 views
1

我希望在發送一個請求後能夠從服務器接收多個響應。這是全部實施扭曲。 服務器:Twisted中的單個請求的多重響應

class HandleReq(resource.Resource): 
    def __init__(self): 
     resource.Resource.__init__(self) 

    def render_GET(self, request): 
     """ 
      Here I basically connect to another server and get multiple 
      responses""" 
     d = defer.Deferred() 
     interface = RemoteService(request, i_deferred) 
     self._connect_to_RemoteService(bf_command, interface) 
     self.handleCallbacks(i_deferred, request) 
     return server.NOT_DONE_YET 

    def render_POST(self, request): 
     '''to make sure both GET/POST are handled''' 
     return self.render_GET(request) 

    def handleCallbacks(self, d, req): 
     msg = d.addCallback(self.getEvent) 
     d.addCallback(self.postResponse(req, msg)) 
     return None 

    def getEvent(self, msg): 
     return msg 

    def postResponse(self, request, response): 
     def post(event): 
      request.setHeader('Content-Type', 'application/json') 
      request.write(response) 
      request.finish() 
      self.postResponse(request, response) 
      return server.NOT_DONE_YET 
     return post 

和客戶端:

from urllib2 import URLError, HTTPError 
api_req = 'http://localhost:8000/req' + '?' + urllib.urlencode({"request": request}) 
req = urllib2.Request(api_req) 
try: 
    response = urllib2.urlopen(api_req) 

except HTTPError, e: 
      print 'Problem with the request' 
      print 'Error code: ', e.code 
except URLError, e: 
      print 'Reason: ', e.reason 
else: 
    j_response = json.loads(response.read()) 

基本上我想要的是服務器不關閉連接(request.finish()),而是繼續發送響應;並且客戶端應該能夠接收這些消息。

回答

3

HTTP不能以這種方式工作。一個HTTP請求只有一個響應。 Twisted Web不會允許您發送多個響應,因爲這會違反HTTP規範,並且沒有HTTP客戶端能夠確定發生了什麼。

可能有另一種方法來實現您的基本目標,但無論它是什麼,它都不會涉及向單個HTTP請求發送多個HTTP響應。