首页 > 编程语言 >day-3 路由底层源码

day-3 路由底层源码

时间:2023-07-11 16:37:15浏览次数:40  
标签:None name Pattern 源码 user path day 路由 view

1. 定义路由本质

比如在url.py定义以下路由,浏览器中输入http://192.168.0.1:8000/user/2003-04-21可以访问

意味着此url http://192.168.0.1:8000/user/2003-04-21url.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

 

 

 现在具体观察这个方法

 

 这里分成两部分查看

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的返回值

 

标签:None,name,Pattern,源码,user,path,day,路由,view
From: https://www.cnblogs.com/khalil12138/p/17541269.html

相关文章

  • 使用LabVIEW实现 DeepLabv3+ 语义分割含源码
    前言图像分割可以分为两类:语义分割(SemanticSegmentation)和实例分割(InstanceSegmentation),前面已经给大家介绍过两者的区别,并就如何在labview上实现相关模型的部署也给大家做了讲解,今天和大家分享如何使用labview实现deeplabv3+的语义分割,并就PascalVOC2012(DeepLabv3Plus-Mo......
  • zabbix自动发现与监控内存和CPU使用率最高的进程,监测路由器
    使用snmp采集信息snmp安装及使用 windows2008设置snmphttps://jingyan.baidu.com/album/3d69c5515e56b3f0cf02d7bf.html?picindex=1路由器配置snmphttps://wenku.baidu.com/view/e08c6f1583d049649a665828.html 一、开启snmp服务,参考网站:router(config)#snmp-servercommuni......
  • 视频直播源码,调整颜色,附颜色大全
    视频直播源码,调整颜色,附颜色大全使用示范:importmatplotlib.pyplotaspltplt.imshow(data.images[0],   #负责对图像进行处理 imge类型:<class'numpy.ndarray'>      cmap=plt.cm.gray_r,    #cmap参数:为调整显示颜色 gray为黑白色,加_r取反为......
  • Vue 学习 day1
    摘要:我们传入 createApp 的对象实际上是一个组件,每个应用都需要一个“根组件”,其他组件将作为其子组件。应用根组件的内容将会被渲染在容器元素里面。容器元素自己将不会被视为应用的一部分。.mount() 方法应该始终在整个应用配置和资源注册完成后被调用。同时请注意,不同......
  • 禁忌搜索算法解决配电网无功优化问题对应的MATLAB源码,有对应的参考资料。
    禁忌搜索算法解决配电网无功优化问题对应的MATLAB源码,有对应的参考资料。电力系统配电网的无功优化规划是保证配电网安全、经济运行的一项有效手段,是降低网损、提高电压质量的重要措施。因此,电力系统配电网无功优化规划问题的研究,既具有理论意义,又具有工程实际应用价值。配电系统......
  • vue-day15--条件渲染
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>条件渲染</title><scripttype......
  • 【安全学习之路】Day32
    后面的明天再学......
  • 算法练习-day17
    二叉树110.平衡二叉树题意:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例:思路:本题我们可以自下而上判断二叉树是否为平衡二叉树,以上图为示例,我们先判断15是不是平衡二叉树,很明显......
  • c++ day 6
    昨天小偷了个懒今天好好搞回来今天还要复习一个概念知识,我这里只是记录我学习过程中的点子。程序性能分析我们先来看一个小故事故事由chatgpt生成 时间复杂度和空间复杂度是分析算法效率和资源消耗的重要指标。让我们逐一了解这两个概念。时间复杂度是衡量算法执行所需......
  • Java-Day-30( 多用户即时通信系统 —— 登录 + 获取在线用户列表 )
    Java-Day-30多用户即时通信系统需求分析用户登录拉取在线用户列表无异常退出私聊群聊发文件服务器推送新闻用户登录功能说明我们暂时人为规定用户名/id=100,密码123456就可以登录,其他用户不能登录后面使用HashMap模拟数据库,可以多个用户登录思路......