Flask路由机制分析之二

一、前言

上篇 《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函数,完成一次请求分发。

相关推荐
ZHOU_WUYI28 分钟前
Flask Docker Demo 项目指南
python·docker·flask
码上淘金5 小时前
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
开发语言·python
Brilliant Nemo5 小时前
四、SpringMVC实战:构建高效表述层框架
开发语言·python
2301_787552875 小时前
console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
人工智能·python·gpt·开源·自动化
懵逼的小黑子5 小时前
Django 项目的 models 目录中,__init__.py 文件的作用
后端·python·django
Y3174296 小时前
Python Day23 学习
python·学习
Ai尚研修-贾莲7 小时前
Python语言在地球科学交叉领域中的应用——从数据可视化到常见数据分析方法的使用【实例操作】
python·信息可视化·数据分析·地球科学
小林学习编程7 小时前
SpringBoot校园失物招领信息平台
java·spring boot·后端
qq_508576097 小时前
if __name__ == ‘__main__‘
python
学地理的小胖砸7 小时前
【Python 基础语法】
开发语言·python