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

浙公网安备 33010602011771号