Browse Source

Fixed #21179 -- Added a StreamingHttpResponse example for CSV files.

Thanks charettes for the suggestion.
zedr 11 years ago
parent
commit
fad47367bf
2 changed files with 41 additions and 1 deletions
  1. 40 0
      docs/howto/outputting-csv.txt
  2. 1 1
      docs/ref/request-response.txt

+ 40 - 0
docs/howto/outputting-csv.txt

@@ -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
 .. _`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
 =========================
 

+ 1 - 1
docs/ref/request-response.txt

@@ -909,7 +909,7 @@ StreamingHttpResponse objects
 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
 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