所以,理解cbv的基础是,理解Mixin。Django中使用Mixin来重用代码,一个View Class可以继承多个Mixin,但是只能继承一个View(包括View的子类),推荐把View写在最右边,多个Mixin写在左边。
四 给视图加装饰器 使用装饰器装饰FBVFBV本身就是一个函数,所以和给普通的函数加装饰器无差:
from django.shortcuts import render, HttpResponse, redirect def wrapper(f): def innser(*args, **kwargs): print('执行前') ret = f(*args, **kwargs) print('执行后') return ret return innser @wrapper def index(request): print('12321') return render(request, 'index.html')使用装饰器装饰CBV
类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。
Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
def wrapper(f): def innser(*args, **kwargs): print('执行前') ret = f(*args, **kwargs) print('执行后') return ret return innser from django.views import View from django.utils.decorators import method_decorator @method_decorator(wrapper,name='get') class LoginView(View): # 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。 # @method_decorator(wrapper) def dispatch(self, request, *args, **kwargs): # print('之前') ret=super().dispatch(request, *args, **kwargs) # print('之后') return ret # @method_decorator(wrapper) def get(self,request): print('get方法执行了') return render(request,'login2.html') # @method_decorator(wrapper) def post(self,request): username=request.POST.get('username') password=request.POST.get('password') print('post方法执行了') print(username,password) return HttpResponse('cg')另外给cbv添加装饰器的时候(先作为了解):
直接添加在dispatch里面,这样每个函数都会执行
from django.utils.decorators import method_decorator @method_decorator(login_test) def dispatch(self, request, *args, **kwargs): res = super(IndexView, self).dispatch(request, *args, **kwargs) return res
添加在每一个函数中
from django.utils.decorators import method_decorator @method_decorator(login_test) def get(self, request, *args, **kwargs): return render(request, 'index.html')
直接添加在类上,后面的name表示只给get添加装饰器
from django.utils.decorators import method_decorator @method_decorator(login_test,)get是给get方法加 (以这种方式如果想给多个方法加装饰器,需要写多层装饰器,因为name这个参数的值必须是个字符串,并且不能同时写两个方法)
@method_decorator(login_test,) post是给post方法加 class IndexView(View): def get(self,request): pass添加装饰器前必须导入from django.utils.decorators import method_decorator
添加装饰器的格式必须为@method_decorator(),括号里面为装饰器的函数名
给类添加是必须声明name
注意csrf-token装饰器的特殊性,在CBV模式下它只能加在dispatch上面(后面再说)
下面这是csrf_token的装饰器:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置csrfToken全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
五 request对象官方文档 请求相关的属性方法(request--HttpRequest对象) def index(request): #http相关请求信息---封装--HttpRequest对象 if request.method == 'GET': print(request.body) #获取post请求提交过来的原始数据 print(request.GET) #获取GET请求提交的数据 # print(request.META) # 请求头相关信息,就是一个大字典 print(request.path) #/index/ 路径 print(request.path_info) #/index/ 路径 print(request.get_full_path()) #/index/?username=dazhuang&password=123 return render(request,'index.html') else: print(request.body) # b'username=dazhuang' print(request.POST) #获取POST请求提交的数据 return HttpResponse('男宾三位,拿好手牌!') 六 response对象与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。