一、FBV
就是基于函数的视图 function base view
就是之前写过最多的那种形式
二、CBV
就是基于类的视图
1、原理即实现流程:
本质通过面向对象的反射
实现流程:
请求到达路由系统后匹配成功后,会执行自定义view类的as_view方法,也就是执行继承的djangoView类的as_view方法,然后执行里面的view方法,在执行dispatch方法,如果自定义view类没有dispatch方法就会去执行django的view类的dispatch方法,在这个dispatch方法里就会首先判断请求的类型是否存在,有的话就利用反射执行对应的请求方法的类型函数
总结:URL------》as_view------》view-------》dispatch,反射执行对应函数
2、url文件中:
# views是视图文件# StudentsView是自己写的类# as_view()是固定搭配url(r'^students/', views.StudentsView.as_view()),
3、视图文件views.py中:CBV中,django会根据请求的类型自动调用对应的方法,比如get请求就调用get方法,post请求就调用post方法
》》》方式一:
from django.views import View# 自己写的类必须要继承django的View类class StudentsView(View): def get(self,request,*args,**kwargs): return HttpResponse('GET') def post(self, request, *args, **kwargs): return HttpResponse('POST') def put(self, request, *args, **kwargs): return HttpResponse('PUT') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE')
》》》方式二:可以用自己定义的类中的dispatch方法,然后再用自己定义的具体的view类去继承
from django.views import Viewclass MyBaseView(object): def dispatch(self, request, *args, **kwargs): print('before') ret = super(MyBaseView,self).dispatch(request, *args, **kwargs) print('after') return retclass StudentsView(MyBaseView,View): def get(self,request,*args,**kwargs): print('get方法') return HttpResponse('GET') def post(self, request, *args, **kwargs): return HttpResponse('POST') def put(self, request, *args, **kwargs): return HttpResponse('PUT') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE')
三、关于csrf_token的验证
我们都知道csrf_token的验证时通过django的中间件来完成的
具体是由中间件的process_view方法执行的
1、在FBV中,我们可以通过两个装饰器来控制对某个函数的csrf_token的验证
from django.views.decorators.csrf import csrf_exempt,csrf_protect# 代表被装饰的函数不需要验证csrf_token@csrf_exempt# 代表被装饰的函数需要验证csrf_token@csrf_protect
2、在CBV中,这两个装饰器就不能直接用了
》》》方式一:加在dispatch方法上
from django.views.decorators.csrf import csrf_exempt,csrf_protectfrom django.utils.decorators import method_decoratorclass StudentsView(View): # 利用method_decorator装饰器,加参数 # 代表post方法就不需要验证csrf_token,若是csrf_protect就是需要 @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(StudentsView,self).dispatch(request, *args, **kwargs) def get(self,request,*args,**kwargs): print('get方法') return HttpResponse('GET')
》》》方式二:加在类上
from django.views.decorators.csrf import csrf_exempt,csrf_protectfrom django.utils.decorators import method_decorator# 多一个name参数,值是dispatch,跟直接加载dispatch方法上是一样的@method_decorator(csrf_exempt,name='dispatch')class StudentsView(View): def get(self,request,*args,**kwargs): print('get方法') return HttpResponse('GET')