mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 07:57:55 +03:00 
			
		
		
		
	Allow HEAD method
This commit is contained in:
		
						commit
						d3557bdcd0
					
				|  | @ -67,6 +67,14 @@ except ImportError: | |||
| # django.views.generic.View (Django >= 1.3) | ||||
| try: | ||||
|     from django.views.generic import View | ||||
|     if not hasattr(View, 'head'): | ||||
|         # First implementation of Django class-based views did not include head method  | ||||
|         # in base View class - https://code.djangoproject.com/ticket/15688 | ||||
|         class ViewPlusHead(View): | ||||
|             def head(self, request, *args, **kwargs): | ||||
|                 return self.get(request, *args, **kwargs) | ||||
|         View = ViewPlusHead | ||||
|          | ||||
| except ImportError: | ||||
|     from django import http | ||||
|     from django.utils.functional import update_wrapper | ||||
|  | @ -145,6 +153,8 @@ except ImportError: | |||
|             #) | ||||
|             return http.HttpResponseNotAllowed(allowed_methods) | ||||
| 
 | ||||
|         def head(self, request, *args, **kwargs): | ||||
|             return self.get(request, *args, **kwargs) | ||||
| 
 | ||||
| try: | ||||
|     import markdown | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ from djangorestframework.compat import RequestFactory | |||
| from djangorestframework.mixins import RequestMixin | ||||
| from djangorestframework.parsers import FormParser, MultiPartParser, PlainTextParser | ||||
| 
 | ||||
| 
 | ||||
| class TestContentParsing(TestCase): | ||||
|     def setUp(self): | ||||
|         self.req = RequestFactory() | ||||
|  | @ -16,6 +15,11 @@ class TestContentParsing(TestCase): | |||
|         view.request = self.req.get('/') | ||||
|         self.assertEqual(view.DATA, None) | ||||
| 
 | ||||
|     def ensure_determines_no_content_HEAD(self, view): | ||||
|         """Ensure view.DATA returns None for HEAD request.""" | ||||
|         view.request = self.req.head('/') | ||||
|         self.assertEqual(view.DATA, None) | ||||
| 
 | ||||
|     def ensure_determines_form_content_POST(self, view): | ||||
|         """Ensure view.DATA returns content for POST request with form content.""" | ||||
|         form_data = {'qwerty': 'uiop'} | ||||
|  | @ -50,6 +54,10 @@ class TestContentParsing(TestCase): | |||
|         """Ensure view.DATA returns None for GET request with no content.""" | ||||
|         self.ensure_determines_no_content_GET(RequestMixin()) | ||||
| 
 | ||||
|     def test_standard_behaviour_determines_no_content_HEAD(self): | ||||
|         """Ensure view.DATA returns None for HEAD request.""" | ||||
|         self.ensure_determines_no_content_HEAD(RequestMixin()) | ||||
| 
 | ||||
|     def test_standard_behaviour_determines_form_content_POST(self): | ||||
|         """Ensure view.DATA returns content for POST request with form content.""" | ||||
|         self.ensure_determines_form_content_POST(RequestMixin()) | ||||
|  |  | |||
|  | @ -24,3 +24,9 @@ class TestMethodOverloading(TestCase): | |||
|         view = RequestMixin() | ||||
|         view.request = self.req.post('/', {view._METHOD_PARAM: 'DELETE'}) | ||||
|         self.assertEqual(view.method, 'DELETE') | ||||
| 
 | ||||
|     def test_HEAD_is_a_valid_method(self): | ||||
|         """HEAD requests identified""" | ||||
|         view = RequestMixin() | ||||
|         view.request = self.req.head('/') | ||||
|         self.assertEqual(view.method, 'HEAD') | ||||
|  |  | |||
|  | @ -55,6 +55,13 @@ class RendererIntegrationTests(TestCase): | |||
|         self.assertEquals(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) | ||||
|         self.assertEquals(resp.status_code, DUMMYSTATUS) | ||||
| 
 | ||||
|     def test_head_method_serializes_no_content(self): | ||||
|         """No response must be included in HEAD requests.""" | ||||
|         resp = self.client.head('/') | ||||
|         self.assertEquals(resp.status_code, DUMMYSTATUS) | ||||
|         self.assertEquals(resp['Content-Type'], RendererA.media_type) | ||||
|         self.assertEquals(resp.content, '') | ||||
| 
 | ||||
|     def test_default_renderer_serializes_content_on_accept_any(self): | ||||
|         """If the Accept header is set to */* the default renderer should serialize the response.""" | ||||
|         resp = self.client.get('/', HTTP_ACCEPT='*/*') | ||||
|  | @ -83,8 +90,6 @@ class RendererIntegrationTests(TestCase): | |||
|         resp = self.client.get('/', HTTP_ACCEPT='foo/bar') | ||||
|         self.assertEquals(resp.status_code, 406) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| _flat_repr = '{"foo": ["bar", "baz"]}' | ||||
| 
 | ||||
| _indented_repr = """{ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user