一、前言
之前我们讲了 一个路由的指向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
2.设置urls,在project下设置url
from django.contrib import adminfrom django.urls import pathfrom app01 import viewsurlpatterns = [ path('admin/', admin.site.urls), path('home/',views.Home.as_view()),]
3.写类Home,在app01下的views.py下编写
from django.shortcuts import renderfrom django.views import Viewclass 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相当于助理一样,既有传递的作用,又有自己的想法。