Fixed #21179 -- Added a StreamingHttpResponse example for CSV files.
Thanks charettes for the suggestion.
This commit is contained in:
parent
5840445664
commit
fad47367bf
|
@ -75,6 +75,46 @@ For more information, see the Python documentation of the :mod:`csv` module.
|
||||||
.. _`csv module's examples section`: http://docs.python.org/library/csv.html#examples
|
.. _`csv module's examples section`: http://docs.python.org/library/csv.html#examples
|
||||||
.. _`python-unicodecsv module`: https://github.com/jdunck/python-unicodecsv
|
.. _`python-unicodecsv module`: https://github.com/jdunck/python-unicodecsv
|
||||||
|
|
||||||
|
.. _streaming-csv-files:
|
||||||
|
|
||||||
|
Streaming large CSV files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When dealing with views that generate very large responses, you might want to
|
||||||
|
consider using Django's :class:`~django.http.StreamingHttpResponse` instead.
|
||||||
|
For example, by streaming a file that takes a long time to generate you can
|
||||||
|
avoid a load balancer dropping a connection that might have otherwise timed out
|
||||||
|
while the server was generating the response.
|
||||||
|
|
||||||
|
In this example, we make full use of Python generators to efficiently handle
|
||||||
|
the assembly and transmission of a large CSV file::
|
||||||
|
|
||||||
|
import csv
|
||||||
|
|
||||||
|
from django.utils.six.moves import range
|
||||||
|
from django.http import StreamingHttpResponse
|
||||||
|
|
||||||
|
class Echo(object):
|
||||||
|
"""An object that implements just the write method of the file-like
|
||||||
|
interface.
|
||||||
|
"""
|
||||||
|
def write(self, value):
|
||||||
|
"""Write the value by returning it, instead of storing in a buffer."""
|
||||||
|
return value
|
||||||
|
|
||||||
|
def some_streaming_csv_view(request):
|
||||||
|
"""A view that streams a large CSV file."""
|
||||||
|
# Generate a sequence of rows. The range is based on the maximum number of
|
||||||
|
# rows that can be handled by a single sheet in most spreadsheet
|
||||||
|
# applications.
|
||||||
|
rows = (["Row {0}".format(idx), str(idx)] for idx in range(65536))
|
||||||
|
pseudo_buffer = Echo()
|
||||||
|
writer = csv.writer(pseudo_buffer)
|
||||||
|
response = StreamingHttpResponse((writer.writerow(row) for row in rows),
|
||||||
|
content_type="text/csv")
|
||||||
|
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
|
||||||
|
return response
|
||||||
|
|
||||||
Using the template system
|
Using the template system
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
|
|
|
@ -909,7 +909,7 @@ StreamingHttpResponse objects
|
||||||
The :class:`StreamingHttpResponse` class is used to stream a response from
|
The :class:`StreamingHttpResponse` class is used to stream a response from
|
||||||
Django to the browser. You might want to do this if generating the response
|
Django to the browser. You might want to do this if generating the response
|
||||||
takes too long or uses too much memory. For instance, it's useful for
|
takes too long or uses too much memory. For instance, it's useful for
|
||||||
generating large CSV files.
|
:ref:`generating large CSV files <streaming-csv-files>`.
|
||||||
|
|
||||||
.. admonition:: Performance considerations
|
.. admonition:: Performance considerations
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue