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

相关推荐
Hylan_J5 分钟前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
莫忘初心丶9 分钟前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
闲猫12 分钟前
go orm GORM
开发语言·后端·golang
丁卯40434 分钟前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
失败尽常态5233 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447743 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农3 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿3 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Leuanghing4 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
bing_1584 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式