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

本文详细介绍了Django中的两种视图实现方式:基于函数的视图(FBV)和基于类的视图(CBV),包括它们的工作原理、实现流程及如何处理CSRF验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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')

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8509818.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值