Django世界-迈出第四步-CBV/FBV

Dajngo学习

  • Django - FBV
  • Django - CBV
    • as_view()
    • 使用Mixin

Django - FBV

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请求怎么处理,等等!

Django - CBV

CBV(class base views) 就是在视图里使用类处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:

  1. OOP [Object Oriented Programming] 的编程方式,提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

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方法去处理,其他请求同理!

as_view()

  1. as_view是一个类方法,因此views.LoginView.as_view()需要添加(),这样才调用这个类方法。as_view执行完,返回是view(函数名)。因此login一旦被用户访问,真正被执行是view函数。
  2. 调用顺序: as_view --> view --> dispatch
  3. class-based-view 提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。

使用Mixin

我觉得要理解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写在左边。

你可能感兴趣的:(Django,Python,python,django)