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

相关推荐
用户8356290780512 分钟前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python
用户83562907805115 分钟前
使用 Python 管理 Excel 工作表:创建、复制、删除与重命名
后端·python
lizhongxuan16 分钟前
Agent Tool
后端
CaffeinePro1 小时前
依赖注入:FastAPI最核心的解耦能力案例解析
后端·fastapi
Assby2 小时前
从 Function Calling 到 MCP:理解 Agent 工具调用的底层通信机制
人工智能·后端
打字机v2 小时前
创建第一个spring-boot项目
后端
像我这样帅的人丶你还2 小时前
Java 后端详解(三):全局异常处理与 JPA 数据库映射
java·后端
前端Hardy2 小时前
又一个 AI 神器火了!
前端·javascript·后端
神奇小汤圆3 小时前
面试被问烂的Java虚拟机调优,我用一个实战案例给你讲得明明白白
后端
明月_清风3 小时前
开发者网络概念全扫盲:一篇搞定
后端·网络协议