源码解析Django CBV的本质 (2)

修改views.py文件

class CBV(View): def dispatch(self, request, *args, **kwargs): func = getattr(self,request.method.lower()) return func(request,*args,**kwargs) def get(self,request): return HttpResponse("GET") def post(self,request): return HttpResponse("POST")

也可以使用继承的方式重写dispatch方法:

class CBV(View): def dispatch(self, request, *args, **kwargs): print("before") res = super(CBV, self).dispatch(request, *args, **kwargs) print("after") return res def get(self,request): return HttpResponse("GET") def post(self,request): return HttpResponse("POST")

刷新浏览器,Django后台打印结果如下:

源码解析Django CBV的本质

浏览器页面结果

源码解析Django CBV的本质

同理,如果有基于CBV的多个类,并且有多个类共用的功能,为了避免重复,可以单独定义一个类,在这个类中重写dispatch方法,然后让url对应的视图类继承这个类

修改urls.py文件

from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^cbv1/$',views.CBV1.as_view()), url(r'^cbv2/$',views.CBV2.as_view()), ]

views.py文件内容

from django.shortcuts import render,HttpResponse from django.views import View class BaseView(object): def dispatch(self, request, *args, **kwargs): func = getattr(self, request.method.lower()) return func(request, *args, **kwargs) class CBV1(BaseView,View): def get(self,request): return HttpResponse("CBV1 GET") def post(self,request): return HttpResponse("CBV1 POST") class CBV2(BaseView,View): def get(self,request): return HttpResponse("CBV2 GET") def post(self,request): return HttpResponse("CBV2 POST")

通过python的面向对象可以知道,请求到达视图类时,会先执行CBV1和CBV2类中的dispatch方法,然而CBV1和CBV2类中并没有dispatch方法,则会按照顺序在父类中查找dispatch方法,此时就会执行BaseView类中的dispatch方法了

用浏览器请求url:8000/cbv1/,浏览器页面显示

源码解析Django CBV的本质

用浏览器请求url:8000/cbv2/,浏览器页面显示

源码解析Django CBV的本质

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjpfd.html