classView:"""
Intentionally simple parent class for all views. Only implements
dispatch-by-method and simple sanity checking.
"""
http_method_names =['get','post','put','patch','delete','head','options','trace']def__init__(self,**kwargs):"""
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""# Go through keyword arguments, and either save their values to our# instance, or raise an error.for key, value in kwargs.items():setattr(self, key, value)
@classonlymethod
defas_view(cls,**initkwargs):"""Main entry point for a request-response process."""for key in initkwargs:if key in cls.http_method_names:raise TypeError("You tried to pass in the %s method name as a ""keyword argument to %s(). Don't do that."%(key, cls.__name__))ifnothasattr(cls, key):raise TypeError("%s() received an invalid keyword %r. as_view ""only accepts arguments that are already ""attributes of the class."%(cls.__name__, key))defview(request,*args,**kwargs):
self = cls(**initkwargs)ifhasattr(self,'get')andnothasattr(self,'head'):
self.head = self.get
self.setup(request,*args,**kwargs)ifnothasattr(self,'request'):raise AttributeError("%s instance has no 'request' attribute. Did you override ""setup() and forget to call super()?"% cls.__name__
)return self.dispatch(request,*args,**kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs
# 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
defdispatch(self, request,*args,**kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower()in self.http_method_names:
handler =getattr(self, request.method.lower(), self.http_method_not_allowed)else:
handler = self.http_method_not_allowed
return handler(request,*args,**kwargs)