aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/api-guide/settings.md6
-rw-r--r--docs/topics/formoverloading.md12
-rw-r--r--rest_framework/settings.py2
-rw-r--r--rest_framework/tests/renderers.py19
-rw-r--r--rest_framework/tests/response.py7
5 files changed, 34 insertions, 12 deletions
diff --git a/docs/api-guide/settings.md b/docs/api-guide/settings.md
index 0f66e85e..43be0d47 100644
--- a/docs/api-guide/settings.md
+++ b/docs/api-guide/settings.md
@@ -136,6 +136,10 @@ The name of a URL parameter that may be used to override the HTTP `Accept` heade
If the value of this setting is `None` then URL accept overloading will be disabled.
-Default: `'_accept'`
+Default: `'accept'`
+
+## URL_FORMAT_OVERRIDE
+
+Default: `'format'`
[cite]: http://www.python.org/dev/peps/pep-0020/
diff --git a/docs/topics/formoverloading.md b/docs/topics/formoverloading.md
index a1828c3b..96cb1388 100644
--- a/docs/topics/formoverloading.md
+++ b/docs/topics/formoverloading.md
@@ -1,10 +1,10 @@
-# Browser based PUT & DELETE
+# Browser hacks
> "There are two noncontroversial uses for overloaded POST. The first is to *simulate* HTTP's uniform interface for clients like web browsers that don't support PUT or DELETE"
>
> — [RESTful Web Services](1), Leonard Richardson & Sam Ruby.
-## Overloading the HTTP method
+## Browser based PUT, DELETE, etc...
**TODO: Preamble.** Note that this is the same strategy as is used in [Ruby on Rails](2).
@@ -16,7 +16,7 @@ For example, given the following form:
`request.method` would return `"DELETE"`.
-## Overloading the HTTP content type
+## Browser based submission of non-form content
Browser-based submission of content types other than form are supported by using form fields named `_content` and `_content_type`:
@@ -29,13 +29,13 @@ For example, given the following form:
`request.content_type` would return `"application/json"`, and `request.content` would return `"{'count': 1}"`
-## Why not just use Javascript?
+## URL based accept headers
-**[TODO]**
+## URL based format suffixes
## Doesn't HTML5 support PUT and DELETE forms?
-Nope. It was at one point intended to support `PUT` and `DELETE` forms, but was later [dropped from the spec](3). There remains [ongoing discussion](4) about adding support for `PUT` and `DELETE`, as well as how to support content-types other than form-encoded data.
+Nope. It was at one point intended to support `PUT` and `DELETE` forms, but was later [dropped from the spec](3). There remains [ongoing discussion](4) about adding support for `PUT` and `DELETE`, as well as how to support content types other than form-encoded data.
[1]: http://www.amazon.com/Restful-Web-Services-Leonard-Richardson/dp/0596529260
[2]: http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work
diff --git a/rest_framework/settings.py b/rest_framework/settings.py
index 8387fd29..2e50e05d 100644
--- a/rest_framework/settings.py
+++ b/rest_framework/settings.py
@@ -54,7 +54,7 @@ DEFAULTS = {
'FORM_METHOD_OVERRIDE': '_method',
'FORM_CONTENT_OVERRIDE': '_content',
'FORM_CONTENTTYPE_OVERRIDE': '_content_type',
- 'URL_ACCEPT_OVERRIDE': '_accept',
+ 'URL_ACCEPT_OVERRIDE': 'accept',
'URL_FORMAT_OVERRIDE': 'format',
'FORMAT_SUFFIX_KWARG': 'format'
diff --git a/rest_framework/tests/renderers.py b/rest_framework/tests/renderers.py
index 751f548f..91d84848 100644
--- a/rest_framework/tests/renderers.py
+++ b/rest_framework/tests/renderers.py
@@ -11,6 +11,7 @@ from rest_framework.views import APIView
from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \
XMLRenderer, JSONPRenderer, DocumentingHTMLRenderer
from rest_framework.parsers import YAMLParser, XMLParser
+from rest_framework.settings import api_settings
from StringIO import StringIO
import datetime
@@ -164,7 +165,11 @@ class RendererEndToEndTests(TestCase):
def test_specified_renderer_serializes_content_on_accept_query(self):
"""The '_accept' query string should behave in the same way as the Accept header."""
- resp = self.client.get('/?_accept=%s' % RendererB.media_type)
+ param = '?%s=%s' % (
+ api_settings.URL_ACCEPT_OVERRIDE,
+ RendererB.media_type
+ )
+ resp = self.client.get('/' + param)
self.assertEquals(resp['Content-Type'], RendererB.media_type)
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)
@@ -177,7 +182,11 @@ class RendererEndToEndTests(TestCase):
def test_specified_renderer_serializes_content_on_format_query(self):
"""If a 'format' query is specified, the renderer with the matching
format attribute should serialize the response."""
- resp = self.client.get('/?format=%s' % RendererB.format)
+ param = '?%s=%s' % (
+ api_settings.URL_FORMAT_OVERRIDE,
+ RendererB.format
+ )
+ resp = self.client.get('/' + param)
self.assertEquals(resp['Content-Type'], RendererB.media_type)
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)
@@ -193,7 +202,11 @@ class RendererEndToEndTests(TestCase):
def test_specified_renderer_is_used_on_format_query_with_matching_accept(self):
"""If both a 'format' query and a matching Accept header specified,
the renderer with the matching format attribute should serialize the response."""
- resp = self.client.get('/?format=%s' % RendererB.format,
+ param = '?%s=%s' % (
+ api_settings.URL_FORMAT_OVERRIDE,
+ RendererB.format
+ )
+ resp = self.client.get('/' + param,
HTTP_ACCEPT=RendererB.media_type)
self.assertEquals(resp['Content-Type'], RendererB.media_type)
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
diff --git a/rest_framework/tests/response.py b/rest_framework/tests/response.py
index af70a387..f74e54fc 100644
--- a/rest_framework/tests/response.py
+++ b/rest_framework/tests/response.py
@@ -11,6 +11,7 @@ from rest_framework.renderers import (
JSONRenderer,
DocumentingHTMLRenderer
)
+from rest_framework.settings import api_settings
class MockPickleRenderer(BaseRenderer):
@@ -121,7 +122,11 @@ class RendererIntegrationTests(TestCase):
def test_specified_renderer_serializes_content_on_accept_query(self):
"""The '_accept' query string should behave in the same way as the Accept header."""
- resp = self.client.get('/?_accept=%s' % RendererB.media_type)
+ param = '?%s=%s' % (
+ api_settings.URL_ACCEPT_OVERRIDE,
+ RendererB.media_type
+ )
+ resp = self.client.get('/' + param)
self.assertEquals(resp['Content-Type'], RendererB.media_type)
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)