diff options
| -rw-r--r-- | docs/api-guide/settings.md | 6 | ||||
| -rw-r--r-- | docs/topics/formoverloading.md | 12 | ||||
| -rw-r--r-- | rest_framework/settings.py | 2 | ||||
| -rw-r--r-- | rest_framework/tests/renderers.py | 19 | ||||
| -rw-r--r-- | rest_framework/tests/response.py | 7 |
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) |
