pythondjangopython-requestsstreamingstreaminghttpresponse

Problem with Django StreamingHttpResponse


I'm having a problem with Django response class StreamingHttpResponse. When I return a generator as response using StreamingHttpResponse and make a request I excepted to retrieve each data block one by one, instead of that i retrieve the full data at once when the generator loop has finished.

My Django View:

def gen_message(msg):
    return '\ndata: {}\n\n'.format(msg)


def iterator():
    for i in range(100):
        yield gen_message('iteration ' + str(i))
        print(i)
        time.sleep(0.1)

class test_stream(APIView):
    def post(self, request):
        stream = iterator()
        response = StreamingHttpResponse(stream, status=200, content_type='text/event-stream')
        response['Cache-Control'] = 'no-cache'
        return response

And I make the request like that:

r = requests.post('https://******/test_stream/', stream=True)


for line in r.iter_lines():

    if line:
        decoded_line = line.decode('utf-8')
        print(decoded_line)

When I see the output of the Django server I can see the print every 0.1 seconds. But the response in the second code only shows when the for loop is finished. Am I misunderstanding the StreamingHttpResponse class or the request class or is there another problem? Thanks:)


Solution

  • You will need to ensure that there is no middleware or webserver in between that first "buffers" the response.

    In Nginx that is possible if the proxy_buffering setting is turned on. You will thus need to disable this with:

    proxy_buffering off;