首页 > 编程语言 >CBV源码分析

CBV源码分析

时间:2023-11-29 15:38:24浏览次数:46  
标签:分析 请求 get self request 源码 CBV UserView view

1.路由配置

path('index/', 视图类名.as_view()) # as_view是类的绑定方法

  

2.执行流程(分析)

path('index/', index),--->请求来了,路由匹配成功会执行 index(request,) 
path('index/', UserView.as_view()),---> 同样的,请求来了,路由匹配成功则会执行 UserView.as_view()(request)

  

3.入口:路由——从as_view()来开始分析

分析过程如下:

1.请求来了,路由匹配成功
2.执行 UserView.as_view()(request)
    -需要看as_view()执行结果是什么—— 结果为:view
     代码如下:
        def view(request, *args, **kwargs): # 方法,可以加括号调用
           return self.dispatch(request, *args, **kwargs)

    -其本质就是在执行 view(request)
    -本质在执行 self.dispatch(request, *args, **kwargs)
3.-去类(UserViwe类中找,找不到,就去父类View中找——谁调用的函数,就从谁最先开始找)中找dispatch,代码如下:
    def dispatch(self, request, *args, **kwargs):
        # request当次请求的请求对象,取出请求方式【假设是get请求】,将request.method的结果 'GET' 转成小写 'get'
        # http_method_names = ['get', 'post', 'put',....]
        # 条件成立,执行if内部代码
        if request.method.lower() in self.http_method_names:
            #getattr:反射方法---》通过字符串去对象中取属性或方法
            # self是谁的对象? 是视图类UserView的对象
            # 取出来的handler 是 UserView这个类的get方法
            handler = getattr(self, 'get')
        else:
            handler = self.http_method_not_allowed
        # handler是 UserView这个类的get方法
        # get(request)---》触发UserView这个类的get方法---》真正执行原来视图函数的内容
        # 最终返回
        return handler(request, *args, **kwargs)
    

  

总结:

写cbv,只需要在视图类中写跟请求方式同名的方法即可
不同请求方式,就会执行不同的方法

标签:分析,请求,get,self,request,源码,CBV,UserView,view
From: https://www.cnblogs.com/wellplayed/p/17864947.html

相关文章

  • SIEM系列|一文读懂 Linux 日志安全分析之文件监控
    摘自:https://zhuanlan.zhihu.com/p/259808863背景介绍在Linux操作系统中,所有内容都是以文件的形式保存和管理的,包括普通文件、目录、网络通信资源等都是文件,即“一切皆文件”。基于这种机制,针对Linux系统层的攻击方式,本质上往往是通过各种方式,对某些敏感文件进行篡改,使入侵......
  • JsonResponse源码分析
    1.视图层返回JsonResponsereturnJsonResponse({'name':'kevin','age':19})2.触发JsonResponse的__init__方法将{'name':'kevin','age':19}传给data3.源码分析def__init__(self,data,encoder=DjangoJSONEn......
  • 图文剖析 big.js 四则运算源码
    big.js,一个小型、快速的用于任意精度的十进制算术的JavaScript库。big.js用于解决平常项目中进行算术运算时精度丢失引起的结果不准确的问题。和big.js类似的两个库bignumber.js和decimal.js也都是出自同一作者(MikeMcl)之手。作者在这里详细说明了他们之间的区别big.......
  • 微信小程序实现语音录制(uni-app源码版)
    注意以下代码只是部分代码,已经将完整代码上传至插件市场,可在插件市场中下载。插件下载地址1.创建音频对象上下文//创建音频上下文letinnerAudioContext=uni.createInnerAudioContext({useWebAudioImplement:false,})this.innerAudioContext=in......
  • 视频直播源码,采用Redis实现购物车功能
    视频直播源码,采用Redis实现购物车功能1Redis核心配置类packagecom.jmh.springboot03.config; importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Configurable;importorg.springframework.context.annot......
  • 手机直播源码,js实现懒加载、vue实现图片懒加载指令
    手机直播源码,js实现懒加载、vue实现图片懒加载指令图片懒加载监听滚动条滚动事件,当视口的高度+滚动高度,大于图片所在位置举例顶部的偏移量时(也就是距离),加载图片资源 index.html<!DOCTYPEhtml><html> <head>  <metacharset="UTF-8">  <metaname="viewport"conte......
  • SPI扩展点在业务中的使用及原理分析
    1什么是SPISPI全称ServiceProviderInterface。面向接口编程中,我们会根据不同的业务抽象出不同的接口,然后根据不同的业务实现建立不同规则的类,因此一个接口会实现多个实现类,在具体调用过程中,指定对应的实现类,当业务发生变化时会导致新增一个新的实现类,亦或是导致已经存在的类......
  • NS-3源码学习(四)wifi-ent-network.cc
    NS-3源码学习(四)wifi-ent-network.cc设定的参数booludp{true};udp/tcp通信选择booldownlink{true};AP->STA:downlink=true/STA->AP:downlink=false数据发送方向选择booluseExtendedBlockAck{false};启用扩展块确认,默认不启用,即块确认的大小为64,启用......
  • 蛋白质组学原理与数据分析合集
    最近看到微信公众号:“生物信息与育种”的文章阅读量太低了,粉丝量基础也很少。可能是做动植物基因组和育种相关工作的人员基数相对较少,而且我也没有主动去推。于是想着把以前做的的蛋白质组学部分笔记迁移到公众号上,一是为内容备份,二是为增加粉丝和阅读量。不过这些笔记是几年前的......
  • 《安富莱嵌入式周报》第326期:航空航天级CANopen协议栈,开源USB PD电源和功耗分析,开源Et
     更新一期视频教程:BSP视频教程第28期:CANopen协议栈专题,CANopen主从机组网实战,CAN词典工具使用方法以及吃透PDO玩法视频版:https://www.bilibili.com/video/BV1H84y1Q717/ 1、航空航天级CANopen协议栈https://gitlab.com/n7space/canopenhttps://canopen.space/#download lely-......