werkzeug/routing.py-Map()源码解析
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
Map类里面的add方法
# 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()源码解析的更多相关文章
- go sync.map源码解析
go中的map是并发不安全的,同时多个协程读取不会出现问题,但是多个协程 同时读写就会出现 fatal error:concurrent map read and map write的错误.通用的解决 ...
- 给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器
今天的主角是HashSet,Set是什么东东,当然也是一种java容器了. 现在再看到Hash心底里有没有会心一笑呢,这里不再赘述hash的概念原理等一大堆东西了(不懂得需要先回去看下Has ...
- ReactiveCocoa源码解析(五) SignalProtocol的observe()、Map、Filter延展实现
上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...
- ReactiveSwift源码解析(五) SignalProtocol的observe()、Map、Filter延展实现
上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...
- Tensorflow版Faster RCNN源码解析(TFFRCNN) (1) VGGnet_test.py
本blog为github上CharlesShang/TFFRCNN版源码解析系列代码笔记第1篇 VGGnet_test.py ----作者:Jiang Wu(吴疆),未经允许,禁止转载--- -- ...
- React源码解析之React.Children.map()(五)
一,React.Children是什么? 是为了处理this.props.children(this.props.children表示所有组件的子节点)这个属性提供的工具,是顶层的api之一 二,Re ...
- [源码解析]为什么mapPartition比map更高效
[源码解析]为什么mapPartition比map更高效 目录 [源码解析]为什么mapPartition比map更高效 0x00 摘要 0x01 map vs mapPartition 1.1 ma ...
- [源码解析] 并行分布式任务队列 Celery 之 Task是什么
[源码解析] 并行分布式任务队列 Celery 之 Task是什么 目录 [源码解析] 并行分布式任务队列 Celery 之 Task是什么 0x00 摘要 0x01 思考出发点 0x02 示例代码 ...
- 给jdk写注释系列之jdk1.6容器(7)-TreeMap源码解析
TreeMap是基于红黑树结构实现的一种Map,要分析TreeMap的实现首先就要对红黑树有所了解. 要了解什么是红黑树,就要了解它的存在主要是为了解决什么问题,对比其他数据结构比如数组,链 ...
- dubbo源码解析五 --- 集群容错架构设计与原理分析
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...
随机推荐
- 一起入门Python1之python的介绍
之前在某安全论坛发表的一些关于python的文章,但是由于一些问题一直没有完成,那个论坛也歇菜了.放到这儿来吧. 说句默心掏肺的话,我也是才学习python.之所以要这个版主,是为了锻炼自己,也是为了 ...
- Flutter异步编程 http网络请求数据
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as ht ...
- Flutter页面跳转返回数据
Dart中的异步请求和等待和ES6中的方法很像,直接使用async...await就可以实现. 核心代码: _navigateToAddress(BuildContext context) async ...
- ionic4 路由跳转、ionic4 路由跳转传值 NavController 返回上一页 、NavController 回到根
1.普通路由跳转 <ion-button [routerLink]="['/pinfo']"> 跳转到详情 </ion-button> <ion-he ...
- Dart 中常用的数组操作方法总结
这里总结了一些在 Dart 中常用的数组操作方法,以便查阅. 首先,我们准备两组数据,以方便后面使用: List<Map> students = [ { 'name': 'tom', 'a ...
- ES6深入浅出-4 迭代器与生成器-1.字面量增强
今天的内容 字面量literal 写出来就是它的值 例如字符串hello.这就是自变量. 一个空对象,也是自变量 写出来就是代表它写出来的那个意思就是自变量. 与其相反的就是构造出来的.例如下面的ne ...
- 算法习题---4-7RAID技术(UV509)
一:题目 (一)基础知识补充(RAID和奇偶校验) 磁盘管理—磁盘阵列(RAID)实例详解(本题目常用RAID 5技术实现) 奇偶校验(同行数据中同位上的1的个数,偶校验时:1的个数为偶数则校验结果为 ...
- win10更新之后vmware使用失败
1.现象 2.解决:把所有更新卸载
- boost写的异步客户端样例代码修改为支持断开重连的代码
考虑到boost的工业级强度,因此就直接用了,代码的官方示例地址:https://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/ ...
- Spring AOP无法拦截Controller
参考@参考文章中的评论 首先,应该打开aop代理 <aop:aspectj-autoproxy proxy-target-class="true"/> 其次,应该讲ao ...