2
0
Эх сурвалжийг харах

Fixed #25576 -- Added IOBase methods required by TextIOWrapper to HttpResponse.

Jon Dufresne 9 жил өмнө
parent
commit
05248a1009

+ 6 - 0
django/http/response.py

@@ -263,6 +263,12 @@ class HttpResponseBase(six.Iterator):
     # These methods partially implement a stream-like object interface.
     # See https://docs.python.org/library/io.html#io.IOBase
 
+    def readable(self):
+        return False
+
+    def seekable(self):
+        return False
+
     def writable(self):
         return False
 

+ 14 - 0
docs/ref/request-response.txt

@@ -807,6 +807,20 @@ Methods
     Returns the value of :attr:`HttpResponse.content`. This method makes
     an :class:`HttpResponse` instance a stream-like object.
 
+.. method:: HttpResponse.readable()
+
+   .. versionadded:: 1.10
+
+    Always ``False``. This method makes an :class:`HttpResponse` instance a
+    stream-like object.
+
+.. method:: HttpResponse.seekable()
+
+   .. versionadded:: 1.10
+
+    Always ``False``. This method makes an :class:`HttpResponse` instance a
+    stream-like object.
+
 .. method:: HttpResponse.writable()
 
     Always ``True``. This method makes an :class:`HttpResponse` instance a

+ 5 - 0
docs/releases/1.10.txt

@@ -174,6 +174,11 @@ Requests and Responses
 
 * Added ``request.user`` to the debug view.
 
+* Added :class:`~django.http.HttpResponse` methods
+  :meth:`~django.http.HttpResponse.readable()` and
+  :meth:`~django.http.HttpResponse.seekable()` to make an instance a
+  stream-like object and allow wrapping it with :py:class:`io.TextIOWrapper`.
+
 Serialization
 ^^^^^^^^^^^^^
 

+ 9 - 0
tests/responses/tests.py

@@ -2,6 +2,8 @@
 
 from __future__ import unicode_literals
 
+import io
+
 from django.conf import settings
 from django.http import HttpResponse
 from django.http.response import HttpResponseBase
@@ -112,3 +114,10 @@ class HttpResponseTests(SimpleTestCase):
         response = HttpResponse(content="Café :)".encode(UTF8), status=201)
         expected = '<HttpResponse status_code=201, "text/html; charset=utf-8">'
         self.assertEqual(repr(response), expected)
+
+    def test_wrap_textiowrapper(self):
+        content = "Café :)"
+        r = HttpResponse()
+        with io.TextIOWrapper(r, UTF8) as buf:
+            buf.write(content)
+        self.assertEqual(r.content, content.encode(UTF8))