第一部分讲的大多都是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,把装饰器当作参数传进去。