详解Django中CBV(Class Base Views)模型源码分析


Posted in Python onFebruary 25, 2019

在view文件中编写一个类,并配置好路由

class Test(View):
 def get(self, request, *args, **kwargs):
 return HttpResponse('cbv_get')

 def post(self, request, *args, **kwargs):
 return HttpResponse('cbv_post')
url(r'test/',views.Test.as_view()),

通过as_view()进入查看源码

详解Django中CBV(Class Base Views)模型源码分析

实际上views.Test.as_view()是存的一个内存地址,加括号被调用,执行了as_view方法里的view方法,具体看下图:

详解Django中CBV(Class Base Views)模型源码分析

核心是dispatch方法,在dispatch方法中完成了分发功能。

详解Django中CBV(Class Base Views)模型源码分析

若要在Test类中自定义dispatch方法,代码如下:

class Test(View):
 def dispatch(self, request, *args, **kwargs):
 # 加代码
 obj = super().dispatch(self, request, *args, **kwargs)
 # 加代码
 # 实现了一个类似装饰器的效果,比如post请求,如果是json,手动从request里body取出来 再转一下
 # 或者走的时候加点cookie
 return obj
 
 def get(self, request, *args, **kwargs):
 return HttpResponse('cbv_get')

 def post(self, request, *args, **kwargs):
 return HttpResponse('cbv_post')

流程总结:

CBV模型

  • 在views中写一个类,继承View,里面写get方法,post方法
  • 在路由中配置: url(r'^test/', views.Test.as_view()),实际上第二个参数位置,放的还是一个函数内存地址
  • 当请求来了,就会执行第二个参数(request,参数),本质上执行view()
  • view内部调用了dispatch()方法
  • dispatch分发方法,根据请求方式不同,执行的方法不同

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
python操作ssh实现服务器日志下载的方法
Jun 03 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
Django操作session 的方法
Mar 09 Python
django 扩展user用户字段inlines方式
Mar 30 Python
Python requests模块安装及使用教程图解
Jun 30 Python
Django celery异步任务实现代码示例
Nov 26 Python
python中@property的作用和getter setter的解释
Dec 22 Python
python获取字符串中的email
Mar 31 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 #Python
详解django中url路由配置及渲染方式
Feb 25 #Python
利用python脚本如何简化jar操作命令
Feb 24 #Python
Python中如何使用if语句处理列表实例代码
Feb 24 #Python
python实现两张图片的像素融合
Feb 23 #Python
Python判断有效的数独算法示例
Feb 23 #Python
Python实现的旋转数组功能算法示例
Feb 23 #Python
You might like
PHP静态类
2006/11/25 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
javascript的理解及经典案例分析
2016/05/20 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
django 将model转换为字典的方法示例
2018/10/16 Python
django 信号调度机制详解
2019/07/19 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
python获取引用对象的个数方式
2019/12/20 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
德国机车企业:FC-Moto
2017/10/27 全球购物
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
企业公益活动策划方案
2014/08/24 职场文书
谢师宴邀请函
2015/02/02 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL