CBV(class base views)模式:url------类
Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提供了一个as_view()静态方法,调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法进行分发,将get请求分发给cbv.get方法处理,将post请求分发给cbv.post方法处理
1.CBV优点
1.提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
2.可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
2.CBV实现过程:
浏览器通过url先执行Login类中的dispatch函数(分发器),dispatch会调用get/post方法
---------urls.py path('xxx',views.Login.as_view()) ---------views.py from django import views class Login(views.View): #继承于views.View类 def dispatch(self, request, *args, **kwargs): #这个函数(了解作用即可,可不写)作用类似于装饰器,源码中使用了反射
ret=super(Login,self).dispatch(request,*args,**kwargs) #重写dispatch方法(关键看传来的是那种请求方式,如果是get请求方式,就执行get方法) print(11111) return ret def get(self,request,*args,**kwargs): #函数名只能是get,一旦有get请求发来,就执行此函数 print("gettttttttt") return render(request,"login.html") def post(self,req,*args,**kwargs): #函数名只能是post,一旦有post请求发来,就执行此函数 user=req.POST.get("username") pwd=req.POST.get("password") rep=redirect("/index")return rep
3.CBV的无名、有名分组
url无名分组
from app01.views import LoginView urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^login/',LoginView.as_view()), url(r'^login/(\d{2})',LoginView.as_view()) ]