网站自动生成,江苏镇江市,做网站推广优化,成都好玩的地方景点推荐一、前言
上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念#xff0c;这节我们具体分析一下路由内部机制#xff0c;Flask路由依赖于werkzegu的routing模块来实现。
二、werkzegu的routing模块介绍
Werkzegu库的routing模块主要功能在于URL…一、前言
上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念这节我们具体分析一下路由内部机制Flask路由依赖于werkzegu的routing模块来实现。
二、werkzegu的routing模块介绍
Werkzegu库的routing模块主要功能在于URL解析根据URL找到对应的视图函数这就是路由routing模块主要有三个类来实现该功能。
注这三个类都在werkzegu/routing.py中。
1、Rule
一个Rule实例代表一个URL模式不同的URL生成不同的Rule实例然后这些Rule实例会被传给Map类形成一个包含所有URL的对象通过这个Map对象就可以解析匹配请求对应的视图函数。 string: 存储原始URL路径包括类型占位符。
endpoint对应的视图函数。
2、Map
Map类存储所有URL规则这些规则就是Rule实例。 3、MapAdapter
由Map对象的bind方法创建由ReqeustContext对象初始化时将请求参数environ传给Map对象创建MapAdapter对象保存在MapAdapter对象的url_adapter属性中。 map:保存Map对象。
match:遍历map中_rules列表对象调用Rule对象的match方法进行实际的匹配过程如果匹配成功则返回该Rule或对应的endpoint和url路径中的参数。 注这段代码演示了werkzeug提供的路由功能添加路由规则、把路由表绑定到特定环境、匹配url正常时返回对应endpoint视图函数或报错。
三、应用启动时注册路由
Flask应用初始化时通过route装饰器创建好Rule对象并添加到Map对象中。 初始化时会被Flask实例父类Scaffold中的route装饰器拦截然后调用子类Flask中的add_url_rule()方法 构造Rule实例并将其加到Map对象中。 四、请求分发过程路由 1、请求入口 wsgi_app()
2、调用request_context()会初始化RequestContext时会构建MapAdapter对象url_adapter字段中,调用MapAdapter对象的match方法找到匹配的Rule并解析出参数保存在Request对象的url_rule和view_args字段中。 3、调用Flask对象的full_dispatch_request、dispatch_request方法通过request中保存的匹配到的Rule获取endpoint以及的view_args参数调用对应的view函数完成一次请求分发。