3月5日学习内容整理:django中的CBV和FBV,以及csrf_token的实现方法以及在CBV中的应用

一、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 View


class MyBaseView(object):
    def dispatch(self, request, *args, **kwargs):
        print('before')
        ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
        print('after')
        return ret

class 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_protect
from django.utils.decorators import method_decorator
class 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_protect
from 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')

 

posted @ 2018-03-05 16:43  九二零  阅读(152)  评论(0编辑  收藏  举报