CBV(class base views)
即在视图里通过类处理请求
首先处理类需要继承View
在路由系统配置请求对应的处理类的as_view()方法
url(r'^obj/', views.obj.as_view()),
当请求执行时根据url执行处理类的父类as_view()方法
在方法中首先通过 self = cls(**initkwargs) 实例化
然后执行处理类的 self.dispatch() 方法,如果处理类没有 dispatch() 方法则执行其父类方法
在 dispatch() 方法中判断请求是否包含在 HTTP 的请求方法中,如果存在则通过反射获取对应函数,然后执行并返回客户端
# as_view() 代码片段
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
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
# dispatch() 代码片段
def dispatch(self, request, *args, **kwargs):
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)