一、什么是FBV&CBV
FBV -Function Base VIew
CBV-Class Base Viev
字面理解就是view层基于方法编写逻辑,和基于类编写逻辑~
这个是java 差别很大,java一直遵循这面向对象编程,但python 的强大就是既能面向函数,也能面向对象这就因此出现了FBV 和CBV
二、如何写FBV&CBV
我更愿意把FBV中的F,理解成def 中的f,我在之前的例子就是典型的FBV
CBV 我们需要 写的类继承from django.views import View
from django.views import View
class Test(View):
def get(self,request):
return redirect('http://www.baidu.com')
#备注 也可以继承dispatch方法
class test(View):
def dispatch(self, request, *args, **kwargs):
data = super(test,self).dispatch(request, *args, **kwargs)
return data
def get(self,request):
return redirect('http://www.baidu.com')
因为技术有限,我是个初学者,通过源码看了下源码只能猜出个大概,我们看一下源码,源码里面有个方法dispatch,中文的意思就是派遣调度
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
我们来翻一下这段,先是进行判断请求的方法是否包含在self.http_method_names 里面,我们在看一下源码中的http_method_names
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
源码中http_method_names是一个集合,里面包含着网页的八中请求方式,也就是当从网页请求头接收到的方法是这八个其中之一的,但具体是怎么反射的可以去看下源码,我技术有限也看不懂只能猜出个大概,但还有点说不通,以后看懂了在详细说吧。
当使用CBV的时候urls 地址映射关系写法也有少许改动
也就类名.as_view方法