aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2012-08-21 01:37:20 -0700
committerTom Christie2012-08-21 01:37:20 -0700
commit21b5601d3b91c1b79b3164f9019245cf8353d417 (patch)
tree95c078c0100b61fa9cea628a13f410393596f0f0
parentcb7a8155608e6a3a801343ec965270eed5acb42f (diff)
parent650c04662dc4b47f285601fefad3b71afc7f6461 (diff)
downloaddjango-rest-framework-21b5601d3b91c1b79b3164f9019245cf8353d417.tar.bz2
Merge pull request #229 from max-arnold/228-runtime-head
add View.head() method at runtime (issue #228)
-rw-r--r--djangorestframework/compat.py43
1 files changed, 36 insertions, 7 deletions
diff --git a/djangorestframework/compat.py b/djangorestframework/compat.py
index c9ae3b93..0772e17b 100644
--- a/djangorestframework/compat.py
+++ b/djangorestframework/compat.py
@@ -65,15 +65,45 @@ except ImportError:
environ.update(request)
return WSGIRequest(environ)
-# django.views.generic.View (Django >= 1.3)
+# django.views.generic.View (1.3 <= Django < 1.4)
try:
from django.views.generic import View
- if not hasattr(View, 'head'):
+
+ if django.VERSION < (1, 4):
+ from django.utils.decorators import classonlymethod
+ from django.utils.functional import update_wrapper
+
# First implementation of Django class-based views did not include head method
# in base View class - https://code.djangoproject.com/ticket/15668
class ViewPlusHead(View):
- def head(self, request, *args, **kwargs):
- return self.get(request, *args, **kwargs)
+ @classonlymethod
+ def as_view(cls, **initkwargs):
+ """
+ Main entry point for a request-response process.
+ """
+ # sanitize keyword arguments
+ for key in initkwargs:
+ if key in cls.http_method_names:
+ raise TypeError(u"You tried to pass in the %s method name as a "
+ u"keyword argument to %s(). Don't do that."
+ % (key, cls.__name__))
+ if not hasattr(cls, key):
+ raise TypeError(u"%s() received an invalid keyword %r" % (
+ cls.__name__, key))
+
+ def view(request, *args, **kwargs):
+ self = cls(**initkwargs)
+ if hasattr(self, 'get') and not hasattr(self, 'head'):
+ self.head = self.get
+ return self.dispatch(request, *args, **kwargs)
+
+ # take name and docstring from class
+ update_wrapper(view, cls, updated=())
+
+ # and possible attributes set by decorators
+ # like csrf_exempt from dispatch
+ update_wrapper(view, cls.dispatch, assigned=())
+ return view
View = ViewPlusHead
except ImportError:
@@ -121,6 +151,8 @@ except ImportError:
def view(request, *args, **kwargs):
self = cls(**initkwargs)
+ if hasattr(self, 'get') and not hasattr(self, 'head'):
+ self.head = self.get
return self.dispatch(request, *args, **kwargs)
# take name and docstring from class
@@ -154,9 +186,6 @@ except ImportError:
#)
return http.HttpResponseNotAllowed(allowed_methods)
- def head(self, request, *args, **kwargs):
- return self.get(request, *args, **kwargs)
-
# PUT, DELETE do not require CSRF until 1.4. They should. Make it better.
if django.VERSION >= (1, 4):
from django.middleware.csrf import CsrfViewMiddleware