mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 16:07:38 +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) | # django.views.generic.View (Django >= 1.3) | ||||||
| try: | try: | ||||||
|     from django.views.generic import View |     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: | except ImportError: | ||||||
|     from django import http |     from django import http | ||||||
|     from django.utils.functional import update_wrapper |     from django.utils.functional import update_wrapper | ||||||
|  | @ -145,6 +153,8 @@ except ImportError: | ||||||
|             #) |             #) | ||||||
|             return http.HttpResponseNotAllowed(allowed_methods) |             return http.HttpResponseNotAllowed(allowed_methods) | ||||||
| 
 | 
 | ||||||
|  |         def head(self, request, *args, **kwargs): | ||||||
|  |             return self.get(request, *args, **kwargs) | ||||||
| 
 | 
 | ||||||
| try: | try: | ||||||
|     import markdown |     import markdown | ||||||
|  |  | ||||||
|  | @ -6,7 +6,6 @@ from djangorestframework.compat import RequestFactory | ||||||
| from djangorestframework.mixins import RequestMixin | from djangorestframework.mixins import RequestMixin | ||||||
| from djangorestframework.parsers import FormParser, MultiPartParser, PlainTextParser | from djangorestframework.parsers import FormParser, MultiPartParser, PlainTextParser | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| class TestContentParsing(TestCase): | class TestContentParsing(TestCase): | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         self.req = RequestFactory() |         self.req = RequestFactory() | ||||||
|  | @ -16,6 +15,11 @@ class TestContentParsing(TestCase): | ||||||
|         view.request = self.req.get('/') |         view.request = self.req.get('/') | ||||||
|         self.assertEqual(view.DATA, None) |         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): |     def ensure_determines_form_content_POST(self, view): | ||||||
|         """Ensure view.DATA returns content for POST request with form content.""" |         """Ensure view.DATA returns content for POST request with form content.""" | ||||||
|         form_data = {'qwerty': 'uiop'} |         form_data = {'qwerty': 'uiop'} | ||||||
|  | @ -50,6 +54,10 @@ class TestContentParsing(TestCase): | ||||||
|         """Ensure view.DATA returns None for GET request with no content.""" |         """Ensure view.DATA returns None for GET request with no content.""" | ||||||
|         self.ensure_determines_no_content_GET(RequestMixin()) |         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): |     def test_standard_behaviour_determines_form_content_POST(self): | ||||||
|         """Ensure view.DATA returns content for POST request with form content.""" |         """Ensure view.DATA returns content for POST request with form content.""" | ||||||
|         self.ensure_determines_form_content_POST(RequestMixin()) |         self.ensure_determines_form_content_POST(RequestMixin()) | ||||||
|  |  | ||||||
|  | @ -24,3 +24,9 @@ class TestMethodOverloading(TestCase): | ||||||
|         view = RequestMixin() |         view = RequestMixin() | ||||||
|         view.request = self.req.post('/', {view._METHOD_PARAM: 'DELETE'}) |         view.request = self.req.post('/', {view._METHOD_PARAM: 'DELETE'}) | ||||||
|         self.assertEqual(view.method, '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.content, RENDERER_A_SERIALIZER(DUMMYCONTENT)) | ||||||
|         self.assertEquals(resp.status_code, DUMMYSTATUS) |         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): |     def test_default_renderer_serializes_content_on_accept_any(self): | ||||||
|         """If the Accept header is set to */* the default renderer should serialize the response.""" |         """If the Accept header is set to */* the default renderer should serialize the response.""" | ||||||
|         resp = self.client.get('/', HTTP_ACCEPT='*/*') |         resp = self.client.get('/', HTTP_ACCEPT='*/*') | ||||||
|  | @ -83,8 +90,6 @@ class RendererIntegrationTests(TestCase): | ||||||
|         resp = self.client.get('/', HTTP_ACCEPT='foo/bar') |         resp = self.client.get('/', HTTP_ACCEPT='foo/bar') | ||||||
|         self.assertEquals(resp.status_code, 406) |         self.assertEquals(resp.status_code, 406) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| _flat_repr = '{"foo": ["bar", "baz"]}' | _flat_repr = '{"foo": ["bar", "baz"]}' | ||||||
| 
 | 
 | ||||||
| _indented_repr = """{ | _indented_repr = """{ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user