首页 > 编程语言 >各种源码分析汇总

各种源码分析汇总

时间:2023-02-01 17:22:53浏览次数:44  
标签:分析 汇总 self request 源码 方法 method view

目录

各种源码分析汇总

​ 本篇文章会总结各种牛逼的方法功能的源码分析,从而更加加深印象、培养自己独立源码分析的能力。本篇分析了CBV源码、APIView源码、Request对象源码···

一、CBV源码分析

1.分析结论

  • 当浏览器客户端想服务端发送请求时通过路由匹配到的对应视图函数加括号调用
  • 路由对应的必须是一个函数地址因此CBV的本质也是FBV
  • as_view也是一个类方法且该方法加括号调用后返回的结果是一个函数内存地址
  • as_view方法在父类view中定义的,通过继承才能用
  • 运行view方法返回self.dispatch()方法的运行结果
  • dispatch方法可以根据不同的请求方式执行视图类中对应的方法

2.分析流程

1 从路由出发
path('api/v1/books/', views.BookView.as_view()),第二个参数无论是fbv还是cbv放的都是函数内存地址
2.当请求来了,匹配成功会执行,views.BookView.as_view()(request)
views.BookView.as_view()执行结果是View的类方法as_view返回的结果是内层函数view,是个函数内层地址
3.本身请求来了,匹配成功,会执行view(request)
    def view(request, *args, **kwargs):
        return self.dispatch(request, *args, **kwargs)
    
4.通过self.dispatch  View类的方法来引出dispatch方法
def dispatch(self, request, *args, **kwargs):
    # request.method请求方式转成小写,必须在列表中才能往下走
    if request.method.lower() in self.http_method_names:
        # 反射,去self【视图类的对象:BookView】,去通过get字符串,反射出属性或方法
        # BookView的get方法
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    # BookView的get方法,加括号,传入request
    return handler(request, *args, **kwargs)

二、APIView源码分析

1.分析结论

  • 去处了所有的csrf
  • 包装了新的request,新的request=request._request
  • 在执行视图类的方法之前、执行了3大认证
  • 如果3大认证执行过程中出现错会有全局异常捕获
  • 以后的视图类方法中的request都是新的了

2.分析流程

1.从路由出发
path('books/', views.BookView.as_view()),
# 请求来了配备到路由就执行第二个参数加括号 这时的as_view是APIView的as_view 这一步以后就没有csrf认证了
2.分析as_view
@classmethod
def as_view(cls, **initkwargs):
    # 调用父类的as_view,父类是Django原生的View
    # 把Django原生View的as_view方法中的闭包函数view拿出来了
    view = super().as_view(**initkwargs)
    # csrf_exempt排除所有csrf的认证
    # 相当于在所有的方法上面加了这个装饰器
    
总结一下前半部分:
路由匹配成功
执行csrf_exempt(view)(request)
View的as_view中的闭包函数view
self.dispatch,self是视图类的对象
BookView继承了APIView的dispatch方法

3.分析dispatch方法
def dispatch(self, request, *args, **kwargs):
    # 这里的老request
    request = self.initialize_request(request, *args, **kwargs)
    # 从此以后就是新的request 老的request在request._request里
    # 把新的request放到了self对象【BookView的对象】
    self.request = request
    try:
        # 在异常捕获这里执行了三大认证
        self.initial(request, *args, **kwargs)
        if request.method.lower() in self.http_method_names:
          handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
            # 把新的request传入了 视图类的方法中get的request也是新的
            response = handler(request, *args, **kwargs)
            
    except Exception as exc:
        # 执行三大认证过程中出现任何异常都能捕获--->全局异常捕获
        response = self.handle_exception(exc)
    self.response = slef.finalize_response(request, response, *args. **kwargs)
    return self.response

三、Request对象源码分析

1.分析结论

  • 新的request用起来跟之前的一样 因为新的获取不到会获取老的
  • request.data对编码格式和请求方式没有限制只要是body中的数据都可以取 取出来都是字典
  • request.query_params就是原来的request._request.GET
  • 上传的文件从request.FILES取

2.分析流程

老的request:django.core.handlers.wsgi.WSGIRequest
新的request:from rest_framework.request import Request
    
1.从 __getattr__方法入手 在视图类的方法中,执行request.method ,新的request是没有method的,就触发了新的Request的__getattr__方法的执行
def __getattr__(self, attr):
	try:
		# 从老的request中反射出 要取得属性
		return getattr(self._request, attr)
	except AttributeError:
		return self.__getattribute__(attr)
    
    
2.request.data 这个方法包装成了数据属性 以后无论post,put···放在body中提交的数据,都从request.data中取,取出来就是字典 也不限制编码格式       
3.request.query_params 这个方法包装成了数据属性 get请求携带的参数,以后从这里面取
query_params:查询参数--->restful规范请求地址中带查询参数       
4.request.FILES这个方法包装成了数据属性前端提交过来的文件,从这里取

标签:分析,汇总,self,request,源码,方法,method,view
From: https://www.cnblogs.com/almira998/p/17083476.html

相关文章

  • Java并发编程——CompletableFuture源码解析
    前言JDK8为我们带来了CompletableFuture这个有意思的新类,它提供比Future更灵活更强大的回调功能,借助CompletableFuture我们可以更方便的编排异步任务。 由于Com......
  • MySQL-JDBC反序列化分析
    0x01前言听师傅们说这条链子用的比较广泛,所以最近学一学,本来是想配合着tabby或是codeql一起看的,但是tabby的环境搭建一直有问题,耽误了很久时间,所以就直接看了。0x......
  • TCGA代码分析流程 - 3.1 生存分析前的数据整理
    生存分析只需要tumor数据,不要normal,将其去掉,新表达矩阵数据命名为exprSet;clinical信息需要进一步整理,成为生存分析需要的格式,新临床信息数据命名为meta。由于不同癌症的临......
  • 678~679 Tomcat安装、卸载、启动 AND 启动问题分析
    Tomcat:Web服务器软件1.下载官网地址:https://tomcat.apache.org/2.安装:解压压缩包即可注:安装目录不要有空格中文3.卸载:删除目录4.启动:进入......
  • ServletContext获取服务器文件路径 文件下载需求分析
    ServletContext获取服务器文件路径方法:String getRealPath(Stringpath) 文件下载需求1页面显示超链接2点击超链接后弹出下载提示框3完成图片文件......
  • python tcp socket 源码分享
    服务端的源码:importsocketserverclassHandler_TCPServer(socketserver.BaseRequestHandler):"""TheTCPServerclassfordemonstration.Note:We......
  • MRS_MounRiver安装与驱动相关问题汇总
    解决问题如下:MounRiver下载与安装若MounRiver某些功能不全或插件没安装MounRiver下载与安装MRS官网下载:http://www.mounriver.com/downloadWindows环境解压后直接运行MounR......
  • 简谈源码-Picasso(v2.71828)
    概述:设计模式用到单例和建造者;网络请求使用OkHttp3;缓存算法使用LRU;线程切换使用Handler​​Picasso官网​​Picasso.get().load(url).into(iv);Picasso的常见使用步骤很简单......
  • 直播系统app源码,简洁好看的登录页面
    直播系统app源码,简洁好看的登录页面1.html <!DOCTYPEhtml><html><head>  <metacharset="UTF-8">  <title>登录界面</title>  <linkrel="stylesheet"hr......
  • MySQL(五)汇总和分组数据
    一、汇总数据工作中经常需要汇总数据而不是将它们全部检索出来(实际数据本身:返回实际数据是对时间和处理资源的浪费),这种类型的检索有以下特点:①确定表中的行数(或者满足某个条......