Django Rest_framework 3(CBV和FBV)

CBV和FBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views) 就是在视图里使用类处理请求。

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

    1.提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
    2.可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
为什么引入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写在左边。
FBV(function base views) 就是在视图里使用函数处理请求。
# urls.py
 url(r'^login/$',views.login, name="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})
CBV**(class base views)** 就是在视图里使用类处理请求
# urls.py    
	url(r'^login/$',views.Login.as_view(), name="login"), 

# views.py
    from django.views import View
    class Login(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})
Django的url是将一个请求分配给可调用的函数的,而不是一个class。
针对这个问题,CBV提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,
然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。
到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。

	def dispatch(self, request, *args, **kwargs):
        # 做分发的
        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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值