day18-Django的CBV和FBV

一、前言

 之前我们讲了 一个路由的指向view.py中的一个函数,今天我们来研究通过路由如何指向一个类,这个设计到django的CBV和FBV的概念,今天我们就来好好说说这个两个产物到底是啥?

  • FBV   => function base view  基于函数视图  =>  /index/ -->指向函数
  • CBV  => class base view  基于类视图  =>   /index/--> 指向类
  • 关于:Django Rest Framework的使用:https://www.cnblogs.com/wupeiqi/articles/7805382.html

二、FBV  

说明:之前我们已经写了很多了,这边就简单的回顾一下,FBV   => /index/ -->指向函数

url.py
       index -> view.函数名

view.py
        def 函数名(request):
            ...

三、 CBV 

3.1、语法

说明:CBV这种是指的是类视图,即:/index/--> 指向类

url.py
       index -> view.类名.as_view()  #这个是固定用法

view.py
       from django.views import View  #导入View模块,并且继承这个类
       class  类名(View):
            
            def get(self,request):  #接收客户端是get请求的,则执行是get方法
                   ....

            def post(self,request): #接收客户端是post请求的,则执行是post方法
                   ....

3.2、举例说明

说明:我们现在设置一个home页面,来说明一下,是如何请求的

1.设置模板,在templates下home.html

<body>
    <form action="/home/" method="post">
        <input type="text" name="user"/>
        <input type="submit" value="提交">
    </form>
</body>

2.设置urls,在project下设置url

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/',views.Home.as_view()),
]

3.写类Home,在app01下的views.py下编写

from django.shortcuts import render
from django.views import View

class Home(View):

    def post(self,request):
        print(request.method)
        return render(request,'home.html')

    def get(self,request):
        print(request.method)
        return render(request,'home.html')

然后 在浏览器中输入 127.0.0.1/home/是get方法,点击提交是post方法:

三、原理说明

  那我们知道,它是如何判定是post的方法还是get方法呐?它是通过说明来找的呐?其实它是通过反射来找的。View这个类中封装了一个方法叫dispatch,就是说执行get或者post方法之前肯定先执行dispatch这个方法,我们看看,这个方法里面有啥?

所以在执行get的或者post方法之前肯定执行dispatch方法,因为通过这个方法反射找到我的get或者post方法。那如果我们在子类里面重写了dispatch方法呐?

class Home(View):
    #重写dispatch方法
    def dispatch(self, request, *args, **kwargs):
        print("before")
        #调用父类中方法
        handle = super(Home,self).dispatch(request,*args,**kwargs)
        print("after")

        return handle

    def get(self,request):
        print(request.method)
        return render(request,'home.html')

    def post(self,request):
        print(request.method,"POST")
        return render(request,'home.html')

既然我先执行的是 dispatch方法,那我重写了,也是先执行dispatch方法,那我就可以在请求get方法或者post方法之后做一些事情,这个功能就像装饰器。dispatch相当于助理一样,既有传递的作用,又有自己的想法。

posted @ 2018-03-02 15:40  帅丶高高  阅读(241)  评论(0编辑  收藏  举报