Minor cleaning up on View

This commit is contained in:
Tom Christie 2013-04-09 18:22:39 +01:00
parent 027792c981
commit c73d0e1e39
2 changed files with 16 additions and 12 deletions

View File

@ -87,9 +87,7 @@ else:
raise ImportError("User model is not to be found.") raise ImportError("User model is not to be found.")
# First implementation of Django class-based views did not include head method if django.VERSION >= (1, 5):
# in base View class - https://code.djangoproject.com/ticket/15668
if django.VERSION >= (1, 4):
from django.views.generic import View from django.views.generic import View
else: else:
from django.views.generic import View as _View from django.views.generic import View as _View
@ -97,6 +95,8 @@ else:
from django.utils.functional import update_wrapper from django.utils.functional import update_wrapper
class View(_View): class View(_View):
# 1.3 does not include head method in base View class
# See: https://code.djangoproject.com/ticket/15668
@classonlymethod @classonlymethod
def as_view(cls, **initkwargs): def as_view(cls, **initkwargs):
""" """
@ -126,11 +126,15 @@ else:
update_wrapper(view, cls.dispatch, assigned=()) update_wrapper(view, cls.dispatch, assigned=())
return view return view
# Taken from @markotibold's attempt at supporting PATCH. # _allowed_methods only present from 1.5 onwards
# https://github.com/markotibold/django-rest-framework/tree/patch def _allowed_methods(self):
http_method_names = set(View.http_method_names) return [m.upper() for m in self.http_method_names if hasattr(self, m)]
http_method_names.add('patch')
View.http_method_names = list(http_method_names) # PATCH method is not implemented by Django
# PATCH method is not implemented by Django
if 'patch' not in View.http_method_names:
View.http_method_names = View.http_method_names + ['patch']
# PUT, DELETE do not require CSRF until 1.4. They should. Make it better. # PUT, DELETE do not require CSRF until 1.4. They should. Make it better.
if django.VERSION >= (1, 4): if django.VERSION >= (1, 4):

View File

@ -38,10 +38,9 @@ class APIView(View):
@property @property
def allowed_methods(self): def allowed_methods(self):
""" """
Return the list of allowed HTTP methods, uppercased. Wrap Django's private `_allowed_methods` interface in a public property.
""" """
return [method.upper() for method in self.http_method_names return self._allowed_methods()
if hasattr(self, method)]
@property @property
def default_response_headers(self): def default_response_headers(self):
@ -69,7 +68,8 @@ class APIView(View):
def http_method_not_allowed(self, request, *args, **kwargs): def http_method_not_allowed(self, request, *args, **kwargs):
""" """
Called if `request.method` does not correspond to a handler method. If `request.method` does not correspond to a handler method,
determine what kind of exception to raise.
""" """
raise exceptions.MethodNotAllowed(request.method) raise exceptions.MethodNotAllowed(request.method)