2012-08-07 4 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 응답을 보내지 않아도됩니다.