mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-03 05:04:31 +03:00
Merge pull request #695 from kuhnza/master
Support for X-HTTP-Method-Override Header
This commit is contained in:
commit
716d86863f
|
@ -19,6 +19,23 @@ For example, given the following form:
|
||||||
|
|
||||||
`request.method` would return `"DELETE"`.
|
`request.method` would return `"DELETE"`.
|
||||||
|
|
||||||
|
## HTTP header based method overriding
|
||||||
|
|
||||||
|
REST framework also supports method overriding via the `X-HTTP-Method-Override`
|
||||||
|
header. This is useful if you are working with non-form content such as
|
||||||
|
JSON and are working with an older web server and/or hosting provider
|
||||||
|
(e.g. [Amazon Web Services ELB][aws_elb]) that doesn't recognise particular
|
||||||
|
HTTP methods such as `PATCH`.
|
||||||
|
|
||||||
|
For example, making a `PATCH` request via `POST` in jQuery:
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: '/myresource/',
|
||||||
|
method: 'POST',
|
||||||
|
headers: {'X-HTTP-Method-Override': 'PATCH'},
|
||||||
|
...
|
||||||
|
});
|
||||||
|
|
||||||
## Browser based submission of non-form content
|
## Browser based submission of non-form content
|
||||||
|
|
||||||
Browser-based submission of content types other than form are supported by
|
Browser-based submission of content types other than form are supported by
|
||||||
|
@ -62,3 +79,4 @@ as well as how to support content types other than form-encoded data.
|
||||||
[rails]: http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work
|
[rails]: http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work
|
||||||
[html5]: http://www.w3.org/TR/html5-diff/#changes-2010-06-24
|
[html5]: http://www.w3.org/TR/html5-diff/#changes-2010-06-24
|
||||||
[put_delete]: http://amundsen.com/examples/put-delete-forms/
|
[put_delete]: http://amundsen.com/examples/put-delete-forms/
|
||||||
|
[aws_elb]: https://forums.aws.amazon.com/thread.jspa?messageID=400724
|
||||||
|
|
|
@ -231,10 +231,13 @@ class Request(object):
|
||||||
"""
|
"""
|
||||||
self._content_type = self.META.get('HTTP_CONTENT_TYPE',
|
self._content_type = self.META.get('HTTP_CONTENT_TYPE',
|
||||||
self.META.get('CONTENT_TYPE', ''))
|
self.META.get('CONTENT_TYPE', ''))
|
||||||
|
|
||||||
self._perform_form_overloading()
|
self._perform_form_overloading()
|
||||||
# if the HTTP method was not overloaded, we take the raw HTTP method
|
|
||||||
if not _hasattr(self, '_method'):
|
if not _hasattr(self, '_method'):
|
||||||
self._method = self._request.method
|
# Method wasn't overloaded by hidden form element, so look for
|
||||||
|
# method override in header. If not present default to raw HTTP method
|
||||||
|
self._method = self.META.get('HTTP_X_HTTP_METHOD_OVERRIDE',
|
||||||
|
self._request.method)
|
||||||
|
|
||||||
def _load_stream(self):
|
def _load_stream(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -58,6 +58,14 @@ class TestMethodOverloading(TestCase):
|
||||||
request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: 'DELETE'}))
|
request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: 'DELETE'}))
|
||||||
self.assertEqual(request.method, 'DELETE')
|
self.assertEqual(request.method, 'DELETE')
|
||||||
|
|
||||||
|
def test_x_http_method_override_header(self):
|
||||||
|
"""
|
||||||
|
POST requests can also be overloaded to another method by setting
|
||||||
|
the X-HTTP-Method-Override header.
|
||||||
|
"""
|
||||||
|
request = Request(factory.post('/', {'foo': 'bar'}, HTTP_X_HTTP_METHOD_OVERRIDE='DELETE'))
|
||||||
|
self.assertEqual(request.method, 'DELETE')
|
||||||
|
|
||||||
|
|
||||||
class TestContentParsing(TestCase):
|
class TestContentParsing(TestCase):
|
||||||
def test_standard_behaviour_determines_no_content_GET(self):
|
def test_standard_behaviour_determines_no_content_GET(self):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user