Map类主要用来存储所有的url规则和一些配置参数的。其中有一些配置的值只存储在Map实例里,因为这些值影响着所有的规则,还有一些其他的默认规则可以被重写。

通过之前分析的add_url_rule源码可以知道,是在add_url_rule方法里调用的Map类,并调用了类的add方法,同时传递了rule对象

 # Map()类__init__源码

 class Map(object):
# 定义一个字典格式的默认转换器
default_converters = ImmutableDict(DEFAULT_CONVERTERS) def __init__(self, rules=None, default_subdomain='', charset='utf-8',
strict_slashes=True, redirect_defaults=True,
converters=None, sort_parameters=False, sort_key=None,
encoding_errors='replace', host_matching=False):
self._rules = []
self._rules_by_endpoint = {}
self._remap = True
self._remap_lock = Lock() self.default_subdomain = default_subdomain
self.charset = charset
self.encoding_errors = encoding_errors
self.strict_slashes = strict_slashes
self.redirect_defaults = redirect_defaults
self.host_matching = host_matching # 由于之前设置了default_converters为不可变类型,所以需要copy一份
self.converters = self.default_converters.copy()
# 如果传递了converters参数,则更新到self.converters里面
if converters:
self.converters.update(converters) self.sort_parameters = sort_parameters
self.sort_key = sort_key # 遍历rules,并调用add方法把每一个遍历对象传递进去
# 实例化的时候这个rules是空的,所以第二次调用是在解析self.url_map.add(rule)的时候
# add方法详情请看下面的解析
for rulefactory in rules or ():
self.add(rulefactory)

参数解析:

  • default_converters = ImmutableDict(DEFAULT_CONVERTERS)
 # 定义一个字典格式的默认转换器
# ImmutableDict是werkzeug/datastructures.py文件里面的一个类,用来把一个字典变成不可变格式
# DEFAULT_CONVERTERS变量是定义在routing.py文件里的一个全局变量
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
  • rules:url规则
  • default_subdomain:默认的子域名
  • charset:编码格式,默认"utf-8"
  • strict_slashes:是否严格要求URL末尾的斜线
  • redirect_defaults:重定向到默认的url
  • converters:转换器,如果重新定义了,会重写原始的
  • sort_parameters:是否排序(url_encode可以看到更详细的信息)
  • sort_key:是否关键字
  • encoding_errors:用与解码的错误方法
  • host_mathcing:如果设置为True,则会通过host去匹配,而不会使用subdomain
备注:sort_parameters 和 sort_key是在0.5版本增加的, encoding_errors和host_matching是在0.7版本增加的

Map类里面的add方法

主要是用来添加新的规则或则工厂函数到map中,并且绑定它。要求这个规则没有被绑定给其他的map
self.url_map.add(rule)
传递的rule是个Rule对象,
 # app()源码

 def add(self, rulefactory):
# 调用Rule类的get_rules方法,返回值为yield self
for rule in rulefactory.get_rules(self):
# 调用Rule类的bind方法
rule.bind(self)
# 添加rule对象到self._rules里面
# url路径,方法,视图函数
# [<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>, <Rule '<test4>|/text3' (POST, OPTIONS) -> test>]
self._rules.append(rule)
# 根据endpoint的规则
# {'static': [<Rule '/static/<filename>' (GET, OPTIONS, HEAD) -> static>], 'test123': [<Rule '<test4>|/text3' (POST, OPTIONS) -> test123>]}
self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule)
self._remap = True

werkzeug/routing.py-Map()源码解析的更多相关文章

  1. go sync.map源码解析

    go中的map是并发不安全的,同时多个协程读取不会出现问题,但是多个协程 同时读写就会出现 fatal error:concurrent map read and map write的错误.通用的解决 ...

  2. 给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器

    今天的主角是HashSet,Set是什么东东,当然也是一种java容器了.      现在再看到Hash心底里有没有会心一笑呢,这里不再赘述hash的概念原理等一大堆东西了(不懂得需要先回去看下Has ...

  3. ReactiveCocoa源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

  4. ReactiveSwift源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

  5. Tensorflow版Faster RCNN源码解析(TFFRCNN) (1) VGGnet_test.py

    本blog为github上CharlesShang/TFFRCNN版源码解析系列代码笔记第1篇   VGGnet_test.py ----作者:Jiang Wu(吴疆),未经允许,禁止转载--- -- ...

  6. React源码解析之React.Children.map()(五)

    一,React.Children是什么? 是为了处理this.props.children(this.props.children表示所有组件的子节点)这个属性提供的工具,是顶层的api之一 二,Re ...

  7. [源码解析]为什么mapPartition比map更高效

    [源码解析]为什么mapPartition比map更高效 目录 [源码解析]为什么mapPartition比map更高效 0x00 摘要 0x01 map vs mapPartition 1.1 ma ...

  8. [源码解析] 并行分布式任务队列 Celery 之 Task是什么

    [源码解析] 并行分布式任务队列 Celery 之 Task是什么 目录 [源码解析] 并行分布式任务队列 Celery 之 Task是什么 0x00 摘要 0x01 思考出发点 0x02 示例代码 ...

  9. 给jdk写注释系列之jdk1.6容器(7)-TreeMap源码解析

    TreeMap是基于红黑树结构实现的一种Map,要分析TreeMap的实现首先就要对红黑树有所了解.      要了解什么是红黑树,就要了解它的存在主要是为了解决什么问题,对比其他数据结构比如数组,链 ...

  10. dubbo源码解析五 --- 集群容错架构设计与原理分析

    欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...

随机推荐

  1. Java 13 特性解读

    Java 13 特性解读    转 https://blog.csdn.net/bjweimengshu/article/details/100978383   2017年8月,JCP执行委员会提出将 ...

  2. Spark获取DataFrame中列的几种姿势--col,$,column,apply

    1.doc上的解释(https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/Column.html)  df("c ...

  3. 011-JSON、JSONObject、JSONArray使用、JSON数组形式字符串转换为List<Map<String,String>>的8种方法

    一.JSON数据格式 1.1.常用JSON数据格式 1.对象方式:JSONObject的数据是用 { } 来表示的, 例如: { "id" : "123", & ...

  4. SQL语句中exists/not exists的用法分析

    作者:Dsw 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT ...

  5. Android Butterknife使用方法总结 IOC框架

    前言: ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神J ...

  6. [ kvm ] 学习笔记 9:WebVirtMgr 基础及安装使用

    目录- 1. 前言- 2. webvirtmgr 简介- 3. webvirtmgr 部署实践    - 3.1 配置 webvirtmgr 主机    - 3.2 kvm node节点配置    - ...

  7. Swift4.0复习Optional

    1.Optional基本使用: 当我们声明一个Optional对象时,无论该对象是在文件作用域还是在函数体内作为局部对象声明,如果不对它初始化,那么它的值默认为空(nil). // 声明a为Int类型 ...

  8. robot:根据条件主动判定用例失败或者通过

    场景: 当用例中的断言部分需要满足特定条件时才会执行,如果不满足条件时,可以主动判定该用例为passed状态,忽略下面的断言语句. 如上图场景,当每月1号时,表中才会生成上月数据,生成后数据不会再有改 ...

  9. win7和Ubuntu16.04之间相互远程控制

    一.在win7中远程控制ubuntu16.04 步骤: 在ubuntu中通过Desktop share打开允许远程访问 ubuntu中安装xrdp 由于xrdp与unity.gnome桌面不兼容,所以 ...

  10. vs2015.无法运行rc.exe

    1.参考文章:无法运行“rc.exe” - wb175208的专栏 - CSDN博客.html(https://blog.csdn.net/wb175208/article/details/83546 ...