mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-23 15:54:16 +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"`.
|
||||
|
||||
## 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 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
|
||||
[html5]: http://www.w3.org/TR/html5-diff/#changes-2010-06-24
|
||||
[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.META.get('CONTENT_TYPE', ''))
|
||||
|
||||
self._perform_form_overloading()
|
||||
# if the HTTP method was not overloaded, we take the raw HTTP 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):
|
||||
"""
|
||||
|
|
|
@ -58,6 +58,14 @@ class TestMethodOverloading(TestCase):
|
|||
request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: '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):
|
||||
def test_standard_behaviour_determines_no_content_GET(self):
|
||||
|
|
Loading…
Reference in New Issue
Block a user