博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day18-Django的CBV和FBV
阅读量:6071 次
发布时间:2019-06-20

本文共 2268 字,大约阅读时间需要 7 分钟。

一、前言

 之前我们讲了 一个路由的指向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相当于助理一样,既有传递的作用,又有自己的想法。

转载于:https://www.cnblogs.com/zhangqigao/articles/8493569.html

你可能感兴趣的文章
菜鸟学Linux 第015篇笔记 bash脚本 条件判断
查看>>
在linux上挂载windows的共享目录
查看>>
Jqgrid -- search button doesn't work with Jquery 1.8.0 or greater
查看>>
XtraBackup物理备份MySQL的流程
查看>>
Java项目对jar包加密流程
查看>>
Ubuntu 16.04搭建nexus管理docker image
查看>>
dell srvadmin 安装部署
查看>>
SQL语句的预编译
查看>>
数字签名
查看>>
Windows Server 2003 R2 Enterprise Edition With SP2 VOL 下载地址及安装密钥
查看>>
条形码组件Spire.Barcode 教程:在Java中扫描条形码
查看>>
微软重新定义Skype
查看>>
XenDesktop7.12发布应用程序
查看>>
oracle11g安装
查看>>
LoadRunner如何开展性能测试
查看>>
4.python-and-or-not
查看>>
java.sql.SQLException: Unknown type '246 in column 0 of 1 in binary-encoded result set的解决办法...
查看>>
Redis 性能问题排查:slowlog 和排队延时
查看>>
我的友情链接
查看>>
【Linux】目录文件权限的查看和修改【转】
查看>>