当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/211309.html

相关文章:

  • vue中如何获取当时时间时分秒
  • matlab simulink 直线一级倒立摆控制(自起摆和稳态控制)
  • Transformers实战(二)快速入门文本相似度、检索式对话机器人
  • 【错误解决方案】ModuleNotFoundError: No module named ‘PeptideBuilder‘
  • 汇编学习(1)
  • C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序
  • 【鸿蒙软件开发】ArkTS容器组件之Badge
  • H5游戏源码分享-命悬一线
  • 【电路笔记】-交流电阻和阻抗
  • android开发使用OkHttp自带的WebSocket实现IM功能
  • 前端小技巧: TS实现柯里化函数
  • 【算法-数组2】有序数组的平方 和 长度最小的子数组
  • H5游戏源码分享-接苹果游戏拼手速
  • 详解类生到死的来龙去脉
  • 寻找倒数第K个节点
  • [ROS系列]ubuntu 20.04 从零配置orbslam3(无坑版)
  • 网络协议--TCP的保活定时器
  • leetcode 1353. 最多可以参加的会议数目
  • hadoop权威指南第四版
  • LeetCode75——Day20
  • 搭建微信小程序环境及项目结构介绍
  • Python通过pyecharts对爬虫房地产数据进行数据可视化分析(一)
  • 关于测试组件junit切换testng的示例以及切换方式分享
  • nginx 内存管理(二)
  • 【DevChat】智能编程助手 - 使用评测
  • Geek challenge 2023 EzHttp
  • matlabR2021a正版免费使用
  • 天气数据可视化平台-计算机毕业设计vue
  • 揭秘Java switch语句中的case穿透现象
  • Java-API简析_java.io.FilterOutputStream类(基于 Latest JDK)(浅析源码)