Django_CBV

 

我们之前往往在django中将一个路径对应到一个视图函数执行,这种模型简称为FBV。那么如果要使用到类的方式那么就要使用到CBV了
使用CBV是在django url控制器添加一条 path('login/', views.Login.as_view()), # 调用的Login 类下的as_view方法

 

1 使用CBV写一个登录认证

# 注意每个类继承views.View, 父类下的dispatch会根据http的不同方法执行类下的方法
from django views.View
class Login(views.View):
    msg = ''

    def get(self, request, *args, **kwargs):
         return render(request,'login.html', {"msg": self.msg})

    def post(self, request, *args, **kwargs):
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)
        user_obj = UserInfo.objects.filter(username=username, password=password).first()
        print(user_obj)
        if user_obj:
                request.session['is_login'] = True
                request.session['username'] = username
                return render(request, "index.html", {'username': username})
        self.msg = '用户名或密码错误'
        return render(request, 'login.html', {'msg': self.msg})

2 给类加装饰器

首先导入django的装饰器工具 from django.utils.decorators import method_decorator

自己写的装饰:
def login_require(func):
    def inner(req, *args, **kwargs):
        is_login = req.session.get('is_login')
        print(is_login)
        username = req.session.get('username')
        if is_login:
            return func(req, username, *args, **kwargs)
        return redirect('/login/')
    return inner

给index的get方法添加装饰器
class Index(views.View):
    @method_decorator(login_require)
    def get(self, request, username, *args, **kwargs):
            print(username)
            return render(request, 'index.html', {'username': username})

3 父类的dispatch方法

如果要是想在父类的方法执行之前,先执行某个自定义的功能,可以通过继承dispatch方法实现

class Order(views.View):
    def dispatch(self, request, *args, **kwargs):
            is_login = request.session.get('is_login')
            print(is_login)
            username = request.session.get('username')
            if is_login:
                ret = super(Order, self).dispatch(request, *args, **kwargs)
                return ret
            else:
                return redirect('/login/')

    def get(self, request, *args, **kwargs):
            return render(request, 'Order.html')

#补充:如果多个类需要在执行get或post等方法执行额外功能,可以在每个类的dispatch方法前面加一个装饰器    
class Buy(views.View):
        @method_decorator(login_require)
        def dispatch(self, request, *args, **kwargs):
            ret = super(Buy,self).dispatch(request, *args, **kwargs) 
            return ret

 

posted @ 2018-08-27 23:11  fat39  阅读(106)  评论(0)    收藏  举报