mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-23 01:57:00 +03:00
URL overrides in settings fixed up slightly
This commit is contained in:
parent
8855a462c6
commit
e7685f3eb5
|
@ -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.
|
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/
|
[cite]: http://www.python.org/dev/peps/pep-0020/
|
||||||
|
|
|
@ -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"
|
> "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.
|
> — [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).
|
**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"`.
|
`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`:
|
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}"`
|
`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?
|
## 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
|
[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
|
[2]: http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work
|
||||||
|
|
|
@ -54,7 +54,7 @@ DEFAULTS = {
|
||||||
'FORM_METHOD_OVERRIDE': '_method',
|
'FORM_METHOD_OVERRIDE': '_method',
|
||||||
'FORM_CONTENT_OVERRIDE': '_content',
|
'FORM_CONTENT_OVERRIDE': '_content',
|
||||||
'FORM_CONTENTTYPE_OVERRIDE': '_content_type',
|
'FORM_CONTENTTYPE_OVERRIDE': '_content_type',
|
||||||
'URL_ACCEPT_OVERRIDE': '_accept',
|
'URL_ACCEPT_OVERRIDE': 'accept',
|
||||||
'URL_FORMAT_OVERRIDE': 'format',
|
'URL_FORMAT_OVERRIDE': 'format',
|
||||||
|
|
||||||
'FORMAT_SUFFIX_KWARG': 'format'
|
'FORMAT_SUFFIX_KWARG': 'format'
|
||||||
|
|
|
@ -11,6 +11,7 @@ from rest_framework.views import APIView
|
||||||
from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \
|
from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \
|
||||||
XMLRenderer, JSONPRenderer, DocumentingHTMLRenderer
|
XMLRenderer, JSONPRenderer, DocumentingHTMLRenderer
|
||||||
from rest_framework.parsers import YAMLParser, XMLParser
|
from rest_framework.parsers import YAMLParser, XMLParser
|
||||||
|
from rest_framework.settings import api_settings
|
||||||
|
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
import datetime
|
import datetime
|
||||||
|
@ -164,7 +165,11 @@ class RendererEndToEndTests(TestCase):
|
||||||
|
|
||||||
def test_specified_renderer_serializes_content_on_accept_query(self):
|
def test_specified_renderer_serializes_content_on_accept_query(self):
|
||||||
"""The '_accept' query string should behave in the same way as the Accept header."""
|
"""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-Type'], RendererB.media_type)
|
||||||
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
||||||
self.assertEquals(resp.status_code, DUMMYSTATUS)
|
self.assertEquals(resp.status_code, DUMMYSTATUS)
|
||||||
|
@ -177,7 +182,11 @@ class RendererEndToEndTests(TestCase):
|
||||||
def test_specified_renderer_serializes_content_on_format_query(self):
|
def test_specified_renderer_serializes_content_on_format_query(self):
|
||||||
"""If a 'format' query is specified, the renderer with the matching
|
"""If a 'format' query is specified, the renderer with the matching
|
||||||
format attribute should serialize the response."""
|
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-Type'], RendererB.media_type)
|
||||||
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
||||||
self.assertEquals(resp.status_code, DUMMYSTATUS)
|
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):
|
def test_specified_renderer_is_used_on_format_query_with_matching_accept(self):
|
||||||
"""If both a 'format' query and a matching Accept header specified,
|
"""If both a 'format' query and a matching Accept header specified,
|
||||||
the renderer with the matching format attribute should serialize the response."""
|
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)
|
HTTP_ACCEPT=RendererB.media_type)
|
||||||
self.assertEquals(resp['Content-Type'], RendererB.media_type)
|
self.assertEquals(resp['Content-Type'], RendererB.media_type)
|
||||||
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
||||||
|
|
|
@ -11,6 +11,7 @@ from rest_framework.renderers import (
|
||||||
JSONRenderer,
|
JSONRenderer,
|
||||||
DocumentingHTMLRenderer
|
DocumentingHTMLRenderer
|
||||||
)
|
)
|
||||||
|
from rest_framework.settings import api_settings
|
||||||
|
|
||||||
|
|
||||||
class MockPickleRenderer(BaseRenderer):
|
class MockPickleRenderer(BaseRenderer):
|
||||||
|
@ -121,7 +122,11 @@ class RendererIntegrationTests(TestCase):
|
||||||
|
|
||||||
def test_specified_renderer_serializes_content_on_accept_query(self):
|
def test_specified_renderer_serializes_content_on_accept_query(self):
|
||||||
"""The '_accept' query string should behave in the same way as the Accept header."""
|
"""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-Type'], RendererB.media_type)
|
||||||
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
|
||||||
self.assertEquals(resp.status_code, DUMMYSTATUS)
|
self.assertEquals(resp.status_code, DUMMYSTATUS)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user