CBV(class base views)
即在視圖里通過(guò)類(lèi)處理請(qǐng)求
首先處理類(lèi)需要繼承View
在路由系統(tǒng)配置請(qǐng)求對(duì)應(yīng)的處理類(lèi)的as_view()方法
? ??url(r'^obj/', views.obj.as_view()),
當(dāng)請(qǐng)求執(zhí)行時(shí)根據(jù)url執(zhí)行處理類(lèi)的父類(lèi)as_view()方法
在方法中首先通過(guò) self = cls(**initkwargs) 實(shí)例化
然后執(zhí)行處理類(lèi)的 self.dispatch() 方法,如果處理類(lèi)沒(méi)有 dispatch() 方法則執(zhí)行其父類(lèi)方法
在 dispatch() 方法中判斷請(qǐng)求是否包含在 HTTP 的請(qǐng)求方法中鲫骗,如果存在則通過(guò)反射獲取對(duì)應(yīng)函數(shù)犬耻,然后執(zhí)行并返回客戶(hù)端
# 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)