一,FBV与CBV的定义
1,FBV
function函数对应view
2,CBV
view对应class类,即view中的对应的是一个类
每一个类中有,get,post,等方法,当网页一这种方法发起时,会调用该方法。
3,实例
//view.py from django import views from django.utils.decorators import method_decorator //装饰器 def outer(func): def inner(request,*args,**kwargs): print(request.method) return func(request,*args,**kwargs) return inner class Login(view.View): @method_decorator(outer) //上面的方法的参数就是装饰器名 def get(self,request,*args,**kwargs): return render(request,'login.html',{'msg':''}) @method_decorator(outer) def post(self,request,*args,**kwargs): user=request.POST.get('user') pwd=request.POST.get('pwd') c=models.Administrator.objects.filter(username=user,password=pwd).count() if c: request.session['is_login']=True request.session['username']=user rep=redirect('/index.html') return rep else: message='用户名或密码错误' return render(request,'login.html',{'msg':message}) //msg对应于前端{{msg}}
urls中的映射类要加as_views()
//urls.py from app1 import views urlpatterns=[ url(r'^admin/',admin.site.urls), url(r'^login.html$',view.Login.as_view()),//类要加as_view() url(r'^login.html$',view.Login) ]
4,dispatch方法
每一个类继承了views.View父类,父类中有一个方法dispatch,用于自动区分响应的方法,找到对应的方法。
当想对每一个方法添加一个装饰器时,一个一个添加会很麻烦,但可以直接加在该方法上,可以省略代码
//base.php //views.View基类中dispatch方法代码 def dispatch(self,request,*args,**kwargs): if request.method.lower() in self.http_method_names: handler=gatattr(self,request.method.lower(),self.http_method_not_allowed) //将一个字符串转换为方法可以直接调用 else: handler=self.http_method_not_allowed return handler(request,*args,**kwargs) def http_method_not_allowed(self,request,*args,**kwargs): pass
给方法加装饰器
from django import views from diango.utils.decorators import method_decorator //装饰器 def outer(func): def inner(request,*args,**kwargs): print(request.method) return func(request,*args,**kwargs) return inner //@method_decorator(outer,name='dispatch') //方法二 class Login(views.View): @method_decorator(outer) //方法一 def dispatch(self,request,*args,**kwargs): ret=super(Login,self).dispatch(request,*args,**kwargs) //继承父类的dispatch方法 return ret def get