summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2012-05-25 19:03:15 +0200
committerAymeric Augustin <aymeric.augustin@m4x.org>2012-05-25 19:03:15 +0200
commite73838b6ddcc7b37c03f9eee04fa6e6a283fedb3 (patch)
tree08031fd77bbf72a54ebc9054de68a9e299934b20 /docs
parent323b414441e13681c2a4117dc7043926f938f48a (diff)
Fixed #17371 -- Made the test client more flexible
The OPTIONS, PUT and DELETE methods no longer apply arbitrary data encoding (in the query string or in the request body).
Diffstat (limited to 'docs')
-rw-r--r--docs/releases/1.5.txt22
-rw-r--r--docs/topics/testing.txt57
2 files changed, 55 insertions, 24 deletions
diff --git a/docs/releases/1.5.txt b/docs/releases/1.5.txt
index 46b599a622..851fed69f7 100644
--- a/docs/releases/1.5.txt
+++ b/docs/releases/1.5.txt
@@ -56,7 +56,7 @@ previously loaded. For example, with the tutorial's models::
True
In Django 1.5, the third line no longer triggers a new SQL query to fetch
-``first_choice.poll``; it was set when by the second line.
+``first_choice.poll``; it was set by the second line.
For one-to-one relationships, both sides can be cached. For many-to-one
relationships, only the single side of the relationship can be cached. This
@@ -101,6 +101,26 @@ year|date:"Y" }}``.
``next_year`` and ``previous_year`` were also added in the context. They are
calculated according to ``allow_empty`` and ``allow_future``.
+OPTIONS, PUT and DELETE requests in the test client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Unlike GET and POST, these HTTP methods aren't implemented by web browsers.
+Rather, they're used in APIs, which transfer data in various formats such as
+JSON or XML. Since such requests may contain arbitrary data, Django doesn't
+attempt to decode their body.
+
+However, the test client used to build a query string for OPTIONS and DELETE
+requests like for GET, and a request body for PUT requests like for POST. This
+encoding was arbitrary and inconsistent with Django's behavior when it
+receives the requests, so it was removed in Django 1.5.
+
+If you were using the ``data`` parameter in an OPTIONS or a DELETE request,
+you must convert it to a query string and append it to the ``path`` parameter.
+
+If you were using the ``data`` parameter in a PUT request without a
+``content_type``, you must encode your data before passing it to the test
+client and set the ``content_type`` argument.
+
Features deprecated in 1.5
==========================
diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt
index d5ccc2d8fc..f35c545c30 100644
--- a/docs/topics/testing.txt
+++ b/docs/topics/testing.txt
@@ -805,45 +805,56 @@ arguments at time of construction:
.. method:: Client.head(path, data={}, follow=False, **extra)
- Makes a HEAD request on the provided ``path`` and returns a ``Response``
- object. Useful for testing RESTful interfaces. Acts just like
- :meth:`Client.get` except it does not return a message body.
+ Makes a HEAD request on the provided ``path`` and returns a
+ ``Response`` object. This method works just like :meth:`Client.get`,
+ including the ``follow`` and ``extra`` arguments, except it does not
+ return a message body.
- If you set ``follow`` to ``True`` the client will follow any redirects
- and a ``redirect_chain`` attribute will be set in the response object
- containing tuples of the intermediate urls and status codes.
-
- .. method:: Client.options(path, data={}, follow=False, **extra)
+ .. method:: Client.options(path, data='', content_type='application/octet-stream', follow=False, **extra)
Makes an OPTIONS request on the provided ``path`` and returns a
``Response`` object. Useful for testing RESTful interfaces.
- If you set ``follow`` to ``True`` the client will follow any redirects
- and a ``redirect_chain`` attribute will be set in the response object
- containing tuples of the intermediate urls and status codes.
+ When ``data`` is provided, it is used as the request body, and
+ a ``Content-Type`` header is set to ``content_type``.
- The ``extra`` argument acts the same as for :meth:`Client.get`.
+ .. versionchanged:: 1.5
+ :meth:`Client.options` used to process ``data`` like
+ :meth:`Client.get`.
+
+ The ``follow`` and ``extra`` arguments act the same as for
+ :meth:`Client.get`.
- .. method:: Client.put(path, data={}, content_type=MULTIPART_CONTENT, follow=False, **extra)
+ .. method:: Client.put(path, data='', content_type='application/octet-stream', follow=False, **extra)
Makes a PUT request on the provided ``path`` and returns a
- ``Response`` object. Useful for testing RESTful interfaces. Acts just
- like :meth:`Client.post` except with the PUT request method.
+ ``Response`` object. Useful for testing RESTful interfaces.
- If you set ``follow`` to ``True`` the client will follow any redirects
- and a ``redirect_chain`` attribute will be set in the response object
- containing tuples of the intermediate urls and status codes.
+ When ``data`` is provided, it is used as the request body, and
+ a ``Content-Type`` header is set to ``content_type``.
+
+ .. versionchanged:: 1.5
+ :meth:`Client.put` used to process ``data`` like
+ :meth:`Client.post`.
- .. method:: Client.delete(path, follow=False, **extra)
+ The ``follow`` and ``extra`` arguments act the same as for
+ :meth:`Client.get`.
+
+ .. method:: Client.delete(path, data='', content_type='application/octet-stream', follow=False, **extra)
Makes an DELETE request on the provided ``path`` and returns a
``Response`` object. Useful for testing RESTful interfaces.
- If you set ``follow`` to ``True`` the client will follow any redirects
- and a ``redirect_chain`` attribute will be set in the response object
- containing tuples of the intermediate urls and status codes.
+ When ``data`` is provided, it is used as the request body, and
+ a ``Content-Type`` header is set to ``content_type``.
+
+ .. versionchanged:: 1.5
+ :meth:`Client.delete` used to process ``data`` like
+ :meth:`Client.get`.
+
+ The ``follow`` and ``extra`` arguments act the same as for
+ :meth:`Client.get`.
- The ``extra`` argument acts the same as for :meth:`Client.get`.
.. method:: Client.login(**credentials)