Django V部分总结二之CBV模式及其CSRF

第一部分讲的大多都是views函数,形如:

path('index/',views.index),

def index(request):
    pass

这种形式成为FBV模式,意思就是一个url对应的是一个具体的函数

还有另一种形式叫做CBV模式,是一个url对应一个类,形式如下:

path('asset-json.html/',views.AssetJsonView.as_view()),

from django.views import View

class AssetView(View):
    '''拿页面'''
    def dispatch(self, request, *args, **kwargs):
    ret = super().dispatch(request, *args, **kwargs)
    return ret
    
    def get(self,request,*args,**kwargs):
        return render(request,"asset.html")
        
    def post(self,request,*args,**kwargs):
    	pass

首先,在views中定义的类是要继承django中的View类的,而AssetView中并未定义as_view()这个方法,所以它会去执行View中的as_view方法

而as_view方法的返回值就是一个函数,这个函数是在as_view中的内部定义的

那么在我们访问url的时候,django会去调用这个view函数,view函数又去调用了self.dispatch方法,并返回了这个方法的返回值

所以查看一下dispatch这个方法:
在这里插入图片描述
它就是对这个请求的method做了一个反射的操作,找到这个请求类型对应的方法然后去执行它,lower()的作用就是把method中的GET/POST等大写的方法名转化成小写的函数名,这样我们只需要在类中定义好小写的函数名就可以完成调用了

原理:
url -> view方法 -> dispatch方法(反射执行其他:GET/POST/DELETE/PUT)

自定义dispatch方法的话,出了可以继承原有方法之外,还可以自定义其他方法

以下是源码父类的部分已有函数:

效果是一个url过来之后会找到对应的类,如果是GET请求,就会执行类下面的get函数;

如果是POST请求,就会执行类下面的post函数

如果是PUT请求,就会执行类下面的put函数(暂知ajax可发)

如果是DELETE请求,就会执行类下面的delete函数(暂知ajax可发)
get 查
post 创建
put 更新
delete 删除

当然还有其它的,另外有一个扩展点:dispath函数

CBV模式下的CSRF

首先FBV下前端请求处理处理通过csrf,详见:
https://blog.youkuaiyun.com/csdniter/article/details/96358437

而在CBV模式下,暂未知前端请求处理通过csrf的方法、。

全局下的crsf两者相同,都是通过中间件的注释与否

局部控制方式有所不同

下面看CBV模式的的两种方式:

from django.views import View
from django.views.decorators.ccsrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator

'''方法1'''
class Login(View):
    # 注意:必须放在dispatch上【源码中反射处理的函数】,单独方法是无效的!!
    
    @ method_decorator(csrf_exempt)
    def dispatch(self, request,  *args, **kwargs):
        return super(Login, self).dispatch(request, *args, **kwargs)
    
    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')

'''方法2【推荐】'''
@ method_decorator(csrf_exempt, name=dispatch)  # dispatch是源码中反射处理的函数
class Login(View):

    def post(self, request, *args, **kwargs):
        return HttpResponse('POST')    

两种方式都是直接去掉整个类里的所有方法,单独函数处理无效

注:# # CBV应用装饰器
django的bug,不能直接对类进行装饰,必须使用 method_decorator,把装饰器当作参数传进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值