diff options
| author | Carles Barrobés | 2011-06-25 12:35:17 +0200 | 
|---|---|---|
| committer | Carles Barrobés | 2011-06-25 12:35:17 +0200 | 
| commit | 0626b618ad0d3c5f8fbb6ab3facce440647fb3c0 (patch) | |
| tree | 516e67b1bfebd4e4dbb9fed4f3dc11fee0afde3a /djangorestframework | |
| parent | fc1640de75511006e89f033c9270ec91a9f1e4d4 (diff) | |
| download | django-rest-framework-0626b618ad0d3c5f8fbb6ab3facce440647fb3c0.tar.bz2 | |
Support for HEAD method
Diffstat (limited to 'djangorestframework')
| -rw-r--r-- | djangorestframework/compat.py | 12 | ||||
| -rw-r--r-- | djangorestframework/tests/content.py | 10 | ||||
| -rw-r--r-- | djangorestframework/tests/methods.py | 6 | ||||
| -rw-r--r-- | djangorestframework/tests/renderers.py | 9 | 
4 files changed, 33 insertions, 4 deletions
diff --git a/djangorestframework/compat.py b/djangorestframework/compat.py index 0274511a..f09b7cc3 100644 --- a/djangorestframework/compat.py +++ b/djangorestframework/compat.py @@ -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 @@ -193,4 +203,4 @@ try:          return md.convert(text)  except ImportError: -    apply_markdown = None
\ No newline at end of file +    apply_markdown = None diff --git a/djangorestframework/tests/content.py b/djangorestframework/tests/content.py index ee3597a4..83ad72d0 100644 --- a/djangorestframework/tests/content.py +++ b/djangorestframework/tests/content.py @@ -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()) diff --git a/djangorestframework/tests/methods.py b/djangorestframework/tests/methods.py index d8f0d919..c3a3a28d 100644 --- a/djangorestframework/tests/methods.py +++ b/djangorestframework/tests/methods.py @@ -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') diff --git a/djangorestframework/tests/renderers.py b/djangorestframework/tests/renderers.py index 54276993..c9108764 100644 --- a/djangorestframework/tests/renderers.py +++ b/djangorestframework/tests/renderers.py @@ -51,6 +51,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='*/*') @@ -79,8 +86,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 = """{  | 
