day-3 路由底层源码
1. 定义路由本质
比如在url.py定义以下路由,浏览器中输入http://192.168.0.1:8000/user/2003-04-21可以访问
意味着此url http://192.168.0.1:8000/user/2003-04-21 和url.py里的路由们做了路由匹配
如果匹配成功找到相应的试图函数

源码解析
ctrl+鼠标左键 点进re_path,会发现
如果re_path = partial(....)
那么上面的url re_path() = partial(), 这里的_path 和Pattern代表什么接着往后看

partial偏函数:
作用:_path()里面规定了要传递一下参数,而path = partial(...)里面传递了Pattern=RegxPatten
那么我们在使用时即不需要再次传递Pattern

点击_path 恍然大悟,_path接收route, view, kwargs, name,Pattern

route view 在url.py已经规定好了, Pattren在partial函数中规定好了

那么这里url.py里的re_path函数就可以写成
partial(_path(route, view, kwargs=None, name=None, Pattern=None), Pattern=RegexPattern)
替换掉route 和 view
partial(_path(r'user/(\d{4})-(\d{2})-(\d{2})', view.user, kwargs=None, name=None, Pattern=None), Pattern=RegexPattern)
因为partial是偏函数,最后路由变成
_path(r'user/(\d{4})-(\d{2})-(\d{2})', view.user, kwargs=None, name=None, Pattern=RegexPattern)
点进_path看看这个函数干啥呢

现在这是我们的路由
re_path(r'user/(\d{4})-(\d{2})-(\d{2})', view.user)就变成了下面这样
URLPattern(Pattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True), view.user, None, None),
因为规定Pattern = RegxPattern
URLPattern(RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True), view.user, None, None),
两个类的关系 URLPattern RegexPattern
URLPattern默认接受四个参数并封装

封装后的
self.pattern = RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True)
self.callback = view.user
其他为None
最后到了RegxPattern类,这里会去封装self._regex
上面传递了RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True)
那么self._regex= r'user/(\d{4})-(\d{2})-(\d{2})'

两层封装结束,现在
URLPattern.pattern._regex = r'user/(\d{4})-(\d{2})-(\d{2})'
self.callback = view.user
2.路由匹配流程
-启动项目
-请求到来
http://127.0.0.1:8000/user/
与定义好的路由逐一匹配
那么路由是怎么找到的呢

wsgi请求入口

往下找到wsgiHandler函数里的__call__方法,
此函数为类方法入口
environ为每次请求时浏览器携带的参数
request = self.request_class(environ)
因为规定
request_class = WSGIRequest
所以
request = WSGIRequest(environ)
封装好后可以通过request.POST request.GET request.method request.FILES 拿到想要的数据
request.path_info 可以拿到地址
比如 https://192.168.0.1:8000/user/, path_info 可以拿到/user/
下一步通过request 进行函数处理拿到response, 点进get_response
点进get_response发现又进行了_middleware_chain处理


再点 _middleware_chain = handler



往上翻找handler到底是什么

传入的mw_instance
mw_instance = middleware(adapted_handler)

又绕回到上面的adapt_method_mode方法
所以adapted_handler = handler




现在确定handler就是_get_response

下图描述有误,匹配后
callback为完整路径, callback_args为浏览器url传递进的参数
比如url.py规定 re_path('/user/(\d+)')
如访问url为 http://192.168.0.1:8000:/user/123
callback为路经所在内存地址, args为123


现在具体观察这个方法


这里分成两部分查看
1. get_resolver()

进一步查看_get_cached_resolver(urlconf)


URlResolver分析完毕,下面看URLResolver里的resolve方法, 图片注释有误




import_module相当于 from day006 import urls
urls.py被导入之后,patterns = urls.urlpatterns
然后就可进行循环
从最开始的讲解
urls.py里的每一条数据
比如 path('user/(\d{4})-(\d{2})-(\d{2})', view.user)也就等于
URLPattern(RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True), view.user, None, None),

每次for pattern做匹配的时候也就是相当于
URLPattern(RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True), view.user, None, None),
找到它下面的resolve方法 传入'user/'做验证
这里的resolve就在URLPattern.resolve(new_path)
因为一个re_path() = URLPattern(RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})', name=None, is_endpoint=True), view.user, None, None),
URLPattern()这里传递的第一个参数为RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})'
所以self.pattern = RegxPattern(r'user/(\d{4})-(\d{2})-(\d{2})'


这里return的返回值

day-3 路由底层源码的更多相关文章
- 7月3日下午 微擎芸众商城 设计思路 - laravel路由底层源码解读
学习参考文章 https://learnku.com/articles/13622/the-principle-of-laravel-routing-execution <?phpnamespa ...
- BAT资深工程师 由浅入深分析 Tp5&Tp6底层源码 - 分享
BAT资深工程师由浅入深分析Tp5&Tp6底层源码 第1章 课程简介 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的 ...
- BAT资深工程师由浅入深分析Tp5&Tp6底层源码☆
第1章 课程简介 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的帮助. 第2章 [TP5灵魂]自动加载Loader 深度分析 ...
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 为什么很多类甚者底层源码要implements Serializable ?
为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...
- List-LinkedList、set集合基础增强底层源码分析
List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...
- List-ArrayList集合基础增强底层源码分析
List集合基础增强底层源码分析 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 集合分为三个系列,分别为:List.set.map List系列 特点:元素有序可重复 有序指的是元素的 ...
- 从底层源码浅析Mybatis的SqlSessionFactory初始化过程
目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- 2018.11.20 Struts2中对结果处理方式分析&struts2内置的方式底层源码剖析
介绍一下struts2内置帮我们封装好的处理结果方式也就是底层源码分析 这是我们的jar包里面找的位置目录 打开往下拉看到result-type节点 name那一列就是我们的type类型取值 上一篇博 ...
随机推荐
- Docker容器网络(基本网络模型)
解析Docker的4种容器网络 默认网络模型 先介绍默认的网络模型: 安装docker后,输入ifconfig就会发现多了网卡中多了一个docker0: $ ifconfig docker0: fla ...
- mybatis xml 中 大于、小于、等于 写法
在 *.xml 中使用常规的 < > = <= >= 会与xml的语法存在冲突 方法一:使用xml 原生转义的方式进行转义 字符名称 sql符号 转义字符 大于号 > & ...
- CefSharp自定义缓存实现
大家好,我是沙漠尽头的狼. 上文介绍了<C#使用CefSharp内嵌网页-并给出C#与JS的交互示例>,本文介绍CefSharp的缓存实现,先来说说添加缓存的好处: 提高页面加载加速:Ce ...
- [Pytorch框架] 2.1.4 数据的加载和预处理
文章目录 PyTorch 基础 :数据的加载和预处理 Dataset Dataloader torchvision 包 torchvision.datasets torchvision.models ...
- Docker compose单机编排工具
Docker compose单机编排工具 目录 Docker compose单机编排工具 docker-compose介绍 Docker Compose使用的三步: docker-compose安装部 ...
- 2020-09-10:java里Object类有哪些方法?
福哥答案2020-09-10: registerNatives:private+static.getClass:返回此 Object 的运行时类. hashCode:返回该对象的哈希码值.equals ...
- 问题解决:TNS-12543: TNS:destination host unreachable
环境: 11.2.0.3 ADG (db11g\db11gadg\db11gcas) 在自己先前克隆后的环境互相tnsping报错. tnsping 本机ok,tnsping其他机器均报错: [ora ...
- Django4全栈进阶之路12 render 函数和 redirect 函数
在 Django 中,你可以使用 render 函数来渲染模板并将其返回给客户端,也可以使用 redirect 函数来重定向到其他 URL. 在 Django 中,render 函数和 redirec ...
- 从 DevOps 到平台工程:软件开发的新范式
DevOps 是一种将开发和运营结合起来的方法,在应用规划.开发.交付和运营方面将人员.流程和技术结合起来.DevOps 使以前孤立的角色(如开发.IT运营.质量工程和安全)之间进行协调和合作.一直以 ...
- Manjaro linux 安装svn 并在文件管理器里显示相关图标
需要先安装svn linux版打开终端执行 sudo pacman -S svn 安装完成后执行一下 svn --version 出现这个就说明svn已经安装完成了,这个时候我们可以执行 svn ch ...