NANVEL

[Django] Pass iterator to response

Sometimes it may be more efficient to transmit response while it being generated.

https://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

Before use this, notice possible performance issues:

  • Django is designed for short-lived requests. Streaming responses will tie a worker process for the entire duration of the response. This may result in poor performance.
  • Generally speaking, you should perform expensive tasks outside of the request-response cycle, rather than resorting to a streamed response.

Small example:

def my_iterator():
    yield 'Hi!\n'
    for i in MyModel.objects.all():
        yield '%s\n' % i.field
    yield 'By!\n'


def my_view(request):
    response = HttpResponse(my_iterator(), content_type='text/plain')
    response['Content-Disposition'] = 'attachment; filename=sometext.txt'
    return response

Licensed under CC BY-SA 3.0