Explorar o código

Fixed #24139 -- Changed HttpResponse.reason_phrase to evaluate based on status_code.

Jon Dufresne %!s(int64=10) %!d(string=hai) anos
pai
achega
d861f95c44
Modificáronse 4 ficheiros con 43 adicións e 6 borrados
  1. 13 5
      django/http/response.py
  2. 18 0
      docs/ref/request-response.txt
  3. 6 1
      docs/releases/1.9.txt
  4. 6 0
      tests/responses/tests.py

+ 13 - 5
django/http/response.py

@@ -37,7 +37,6 @@ class HttpResponseBase(six.Iterator):
     """
 
     status_code = 200
-    reason_phrase = None        # Use default reason phrase for status code.
 
     def __init__(self, content_type=None, status=None, reason=None, charset=None):
         # _headers is a mapping of the lower-case name to the original case of
@@ -52,16 +51,25 @@ class HttpResponseBase(six.Iterator):
         self.closed = False
         if status is not None:
             self.status_code = status
-        if reason is not None:
-            self.reason_phrase = reason
-        elif self.reason_phrase is None:
-            self.reason_phrase = responses.get(self.status_code, 'Unknown Status Code')
+        self._reason_phrase = reason
         self._charset = charset
         if content_type is None:
             content_type = '%s; charset=%s' % (settings.DEFAULT_CONTENT_TYPE,
                                                self.charset)
         self['Content-Type'] = content_type
 
+    @property
+    def reason_phrase(self):
+        if self._reason_phrase is not None:
+            return self._reason_phrase
+        # Leave self._reason_phrase unset in order to use the default
+        # reason phrase for status code.
+        return responses.get(self.status_code, 'Unknown Status Code')
+
+    @reason_phrase.setter
+    def reason_phrase(self, value):
+        self._reason_phrase = value
+
     @property
     def charset(self):
         if self._charset is not None:

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

@@ -631,6 +631,12 @@ Attributes
 
     The `HTTP status code`_ for the response.
 
+    .. versionchanged:: 1.9
+
+        Unless :attr:`reason_phrase` is explicitly set, modifying the value of
+        ``status_code`` outside the constructor will also modify the value of
+        ``reason_phrase``.
+
 .. attribute:: HttpResponse.reason_phrase
 
     The HTTP reason phrase for the response.
@@ -642,6 +648,9 @@ Attributes
 
         .. _`HTTP standard's`: https://www.ietf.org/rfc/rfc2616.txt
 
+        Unless explicitly set, ``reason_phrase`` is determined by the current
+        value of :attr:`status_code`.
+
 .. attribute:: HttpResponse.streaming
 
     This is always ``False``.
@@ -987,6 +996,12 @@ Attributes
 
     The `HTTP status code`_ for the response.
 
+    .. versionchanged:: 1.9
+
+        Unless :attr:`reason_phrase` is explicitly set, modifying the value of
+        ``status_code`` outside the constructor will also modify the value of
+        ``reason_phrase``.
+
 .. attribute:: StreamingHttpResponse.reason_phrase
 
     The HTTP reason phrase for the response.
@@ -998,6 +1013,9 @@ Attributes
 
         .. _`HTTP standard's`: https://www.ietf.org/rfc/rfc2616.txt
 
+        Unless explicitly set, ``reason_phrase`` is determined by the current
+        value of :attr:`status_code`.
+
 .. attribute:: StreamingHttpResponse.streaming
 
     This is always ``True``.

+ 6 - 1
docs/releases/1.9.txt

@@ -163,7 +163,12 @@ Templates
 Requests and Responses
 ^^^^^^^^^^^^^^^^^^^^^^
 
-* ...
+* Unless :attr:`HttpResponse.reason_phrase
+  <django.http.HttpResponse.reason_phrase>` is explicitly set, it now is
+  determined by the current value of :attr:`HttpResponse.status_code
+  <django.http.HttpResponse.status_code>`. Modifying the value of
+  ``status_code`` outside of the constructor will also modify the value of
+  ``reason_phrase``.
 
 Tests
 ^^^^^

+ 6 - 0
tests/responses/tests.py

@@ -54,6 +54,12 @@ class HttpResponseTests(SimpleTestCase):
         self.assertEqual(resp.status_code, 503)
         self.assertEqual(resp.reason_phrase, "Service Unavailable")
 
+    def test_change_status_code(self):
+        resp = HttpResponse()
+        resp.status_code = 503
+        self.assertEqual(resp.status_code, 503)
+        self.assertEqual(resp.reason_phrase, "Service Unavailable")
+
     def test_reason_phrase(self):
         reason = "I'm an anarchist coffee pot on crack."
         resp = HttpResponse(status=814, reason=reason)