FBV(function base views) 就是在视图里使用函数处理请求。
urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', account.login),
]
views.py
# 登录验证
def login(request):
message = ""
if request.method == "POST":
user = request.POST.get('username')
pwd = request.POST.get('password')
c = Administrator.objects.filter(username=user, password=pwd).count()
if c:
request.session['is_login'] = True
request.session['username'] = user
return redirect('/index.html')
else:
message = "用户名或密码错误"
return render(request, 'login.html', {
'msg': message})
说白了,FBV就是在views.py文件中定义函数来处理用户请求,函数中再定义如果是GET请求怎么处理,POST请求怎么处理,等等!
CBV(class base views) 就是在视图里使用类处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:
urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', account.Login.as_view()),
]
views.py
from django import views
from django.utils.decorators import method_decorator
class Login(views.View):
def get(self, request, *args, **kwagrs):
return render(request, 'login.html')
def post(self, request, *args, **kwagrs):
user = request.POST.get('username')
pwd = request.POST.get('password')
c = Administrator.objects.filter(username=user, password=pwd).count()
if c:
request.session['is_login'] = True
request.session['username'] = user
return redirect('/index.html')
else:
message = "用户名或密码错误"
return render(request, 'login.html', {
'msg': message})
当我们使用CBV方式时,首先要注意urls.py文件中要写成“类名.as_view()”方式映射,其次在类中我们定义的get/post方法这些方法的名字不是我们自己定义的,而是按照固定样式,View类中支持以下方法:
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
当我们发送GET请求时,类自动将GET请求转到get方法去处理,其他请求同理!
我觉得要理解django的class-based-view(以下简称cbv),首先要明白django引入cbv的目的是什么。在django1.3之前,generic view也就是所谓的通用视图,使用的是function-based-view(fbv),亦即基于函数的视图。有人认为fbv比cbv更pythonic,窃以为不然。python的一大重要的特性就是面向对象。而cbv更能体现python的面向对象。cbv是通过class的方式来实现视图方法的。class相对于function,更能利用多态的特定,因此更容易从宏观层面上将项目内的比较通用的功能抽象出来。关于多态,不多解释,有兴趣的同学自己Google。总之可以理解为一个东西具有多种形态(的特性)。cbv的实现原理通过看django的源码就很容易明白,大体就是由url路由到这个cbv之后,通过cbv内部的dispatch方法进行分发,将get请求分发给cbv.get方法处理,将post请求分发给cbv.post方法处理,其他方法类似。怎么利用多态呢?cbv里引入了mixin的概念。Mixin就是写好了的一些基础类,然后通过不同的Mixin组合成为最终想要的类。
所以,理解cbv的基础是,理解Mixin。Django中使用Mixin来重用代码,一个View Class可以继承多个Mixin,但是只能继承一个View(包括View的子类),推荐把View写在最右边,多个Mixin写在左边。