CBV

一,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

 

posted on 2020-09-11 10:34  居一雪  阅读(482)  评论(0编辑  收藏  举报

导航