Django CBV模型源码运行流程详解


Posted in Python onAugust 17, 2020

在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模型源码运行流程详解

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

Django CBV模型源码运行流程详解

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

Django CBV模型源码运行流程详解

若要在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 相关文章推荐
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
python rsa 加密解密
Mar 20 Python
如何在python中使用selenium的示例
Dec 26 Python
Python之文字转图片方法
May 10 Python
python traceback捕获并打印异常的方法
Aug 31 Python
python事件驱动event实现详解
Nov 21 Python
自学python的建议和周期预算
Jan 30 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
无惧面试,带你搞懂python 装饰器
Aug 17 #Python
Python Request类源码实现方法及原理解析
Aug 17 #Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 #Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 #Python
Django DRF认证组件流程实现原理详解
Aug 17 #Python
python使用建议与技巧分享(二)
Aug 17 #Python
详解python方法之绑定方法与非绑定方法
Aug 17 #Python
You might like
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
php解析json数据实例
2014/08/19 PHP
php中引用符号(&)的使用详细介绍
2016/12/06 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
Python脚本处理空格的方法
2016/08/08 Python
python unittest实现api自动化测试
2018/04/04 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
Python二元赋值实用技巧解析
2019/10/25 Python
python global和nonlocal用法解析
2020/02/03 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
如何做好总经理助理
2013/11/12 职场文书
新护士岗前培训制度
2014/02/02 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
小学毕业演讲稿
2014/04/25 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2014年护理部工作总结
2014/11/14 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
nginx安装以及配置的详细过程记录
2021/09/15 Servers