diff options
| author | Collin Anderson <cmawebsite@gmail.com> | 2015-01-03 12:06:24 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-01-05 10:51:52 -0500 |
| commit | 3d2cae0896ee8026d1c2c5d31e4c4c8f74f2fef4 (patch) | |
| tree | 1abf00da86cd8831b829124a32058ea589b78b3c /django/http/response.py | |
| parent | 05f702b94ca4ad77236a1e299270e8014def02e6 (diff) | |
Fixed #24072 -- Added FileResponse for streaming binary files.
Diffstat (limited to 'django/http/response.py')
| -rw-r--r-- | django/http/response.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/django/http/response.py b/django/http/response.py index 2735e3c59d..5168834b23 100644 --- a/django/http/response.py +++ b/django/http/response.py @@ -417,6 +417,9 @@ class StreamingHttpResponse(HttpResponseBase): @streaming_content.setter def streaming_content(self, value): + self._set_streaming_content(value) + + def _set_streaming_content(self, value): # Ensure we can never iterate on "value" more than once. self._iterator = iter(value) if hasattr(value, 'close'): @@ -429,6 +432,22 @@ class StreamingHttpResponse(HttpResponseBase): return b''.join(self.streaming_content) +class FileResponse(StreamingHttpResponse): + """ + A streaming HTTP response class optimized for files. + """ + block_size = 4096 + + def _set_streaming_content(self, value): + if hasattr(value, 'read'): + self.file_to_stream = value + filelike = value + value = iter(lambda: filelike.read(self.block_size), b'') + else: + self.file_to_stream = None + super(FileResponse, self)._set_streaming_content(value) + + class HttpResponseRedirectBase(HttpResponse): allowed_schemes = ['http', 'https', 'ftp'] |
