Несколько ответов на один запрос в 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()), а вместо этого продолжал посылать ответы; и клиент должен иметь возможность получать эти сообщения.
1 ответ
HTTP не работает таким образом. HTTP-запрос имеет ровно один ответ. Twisted Web не позволит вам отправить более одного ответа, потому что это будет противоречить спецификации HTTP, и никакие клиенты HTTP не смогут выяснить, что происходит.
Возможно, существует другой способ достижения ваших основных целей, но в любом случае он не будет включать отправку более одного HTTP-ответа на один HTTP-запрос.