(七)Flask之路由转换器

引子:

from flask import Flaskapp = Flask(__name__)# 通过使用<int>转换器,可以捕获URL中的整数值,并将其作为参数传递给视图函数。
@app.route('/index/<int:nid>', methods=['GET', 'POST'])
def index(nid):print(nid)return 'Index'if __name__ == '__main__':app.run('localhost', 4000)

上述代码中,<int:nid>部分表示nid是一个整数型的动态路由参数。当用户访问形如/index/666的路径时,会执行index函数并将匹配到的nid作为参数传递进去。

Flask自带的路由转换器

Flask提供了多种路由转换器(Route Converters),用于在路由规则中捕获和转换URL中的动态部分。这些转换器允许我们指定特定类型的参数,并限制其匹配的模式。

使用路由转换器时,只需像引子那样将转换器名称放在路由规则中的动态部分尖括号内即可。

常用路由转换器实际使用类似如下:

# 字符串
@app.route('/user/<username>')@app.route('/post/<int:post_id>')@app.route('/post/<float:post_id>')@app.route('/post/<path:path>')@app.route('/login', methods=['GET', 'POST'])

下面这段代码定义了Flask中默认的路由转换器(Route Converters)及其对应的类:

DEFAULT_CONVERTERS = {# 默认转换器,用于匹配任意不包含斜杠的字符串。它使用`UnicodeConverter`类进行转换。'default':            UnicodeConverter,# 同样是匹配任意不包含斜杠的字符串,使用`UnicodeConverter`类进行转换。'string':             UnicodeConverter,# 用于匹配任意类型的数据,可以包含斜杠等特殊字符。它使用`AnyConverter`类进行转换。'any':                AnyConverter,# 用于匹配包含斜杠的字符串,通常用于捕获整个路径段。它使用`PathConverter`类进行转换。'path':               PathConverter,# 用于匹配正整数,使用`IntegerConverter`类进行转换。'int':                IntegerConverter,# 用于匹配浮点数,使用`FloatConverter`类进行转换。'float':              FloatConverter,# 用于匹配符合UUID格式的字符串,使用`UUIDConverter`类进行转换。'uuid':               UUIDConverter,
}

这些默认的路由转换器提供了基本的类型匹配功能,可以根据URL中的动态部分的类型和模式进行精确匹配和转换。

在Flask中,我们也可以自定义自己的路由转换器,通过继承werkzeug.routing.BaseConverter类并实现相应的转换逻辑。然后,我们可以使用app.url_map.converters字典将自定义转换器注册到应用程序中。

自定义路由转换器:

自定义Flask的正则路由转换器,并将其应用于路由规则。

from flask import Flask
from werkzeug.routing import BaseConverterapp = Flask(__name__)class RegexConverter(BaseConverter):"""自定义URL匹配正则表达式"""def __init__(self, map, regex):super(RegexConverter, self).__init__(map)self.regex = regexdef to_python(self, value):"""路由匹配时,匹配成功后传递给视图函数中参数的值:param value::return:"""return int(value)def to_url(self, value):"""使用url_for反向生成url时,传递的参数经过该方法处理,返回的值用于生成url中的参数:param value::return:"""val = super(RegexConverter, self).to_url(value)return val# 添加到flask中
app.url_map.converters['regex'] = RegexConverter@app.route(r'/index/<regex("\d+"):nid>')
def index(nid):print(nid, type(nid))return 'Index'if __name__ == '__main__':app.run('localhost', 4000)

代码讲解:

  1. 引入必要的模块和库:

    • from flask import Flask:导入Flask类,用于创建Flask应用程序。
    • from werkzeug.routing import BaseConverter:导入BaseConverter类,它是Werkzeug库中的路由转换器基类,用于定义自定义转换器。
  2. 创建Flask应用程序实例:

    app = Flask(__name__)

  3. 定义自定义转换器类RegexConverter

    这个类继承自BaseConverter类,并重写了to_python方法和to_url方法,以便在路由匹配成功时和反向生成URL时对参数进行处理。

  4. 将自定义转换器添加到Flask应用程序中:

    app.url_map.converters['regex'] = RegexConverter

    通过将自定义转换器对象RegexConverter赋值给converters字典的键为'regex'的位置,将自定义转换器添加到Flask应用程序的URL映射器中。

  5. 定义视图函数:

    @app.route(r'/index/<regex("\d+"):nid>')
    def index(nid):print(nid, type(nid))return 'Index'
    

    在上述代码中,定义了一个名为index的视图函数,它接受一个参数nid,并使用自定义转换器<regex("\d+"):nid>来匹配URL中的动态部分。

一句话概括:

  • 上述代码使用自定义路由转换器RegexConverter来处理URL中的动态部分。通过定义自定义转换器,并将其添加到Flask应用程序中,可以实现根据正则表达式模式匹配URL并对参数进行处理。

在这里插入图片描述

看看在RegexConverter类的构造方法__init__中的两个参数:mapregex

  • map参数是一个Map对象,它代表URL映射器,用于将路由规则映射到相应的视图函数。通过调用父类BaseConverter的构造方法,将map作为参数传递给父类,以确保父类能够正常初始化。
  • regex参数是一个表示正则表达式的字符串,它用于定义匹配URL动态部分的正则表达式模式。

在上述这个例子中,我们自定义了一个名为RegexConverter的转换器,并将其应用于路由规则中的nid参数。使用<regex("\d+"):nid>作为路由规则,其中regex("\d+")表示我们想要匹配一个或多个数字。通过将regex("\d+")传递给自定义转换器的构造方法,在转换过程中会使用这个正则表达式模式来匹配URL中的动态部分。

**自定义转换器的作用是根据定义的正则表达式模式将URL中的动态部分转换为特定的数据类型,以便在视图函数中进行处理。**在这个例子中,我在自定义转换器的to_python方法中将匹配到的值转换为整数,以便在视图函数中使用。

如何应用于反向生成url_for()

在这里插入图片描述在这里插入图片描述在这里插入图片描述

简单讲几嘴to_url()函数:

to_url函数是自定义路由转换器中的一个方法,用于在使用url_for函数反向生成URL时对参数进行处理。

在这个例子中,我在自定义转换器RegexConverter中重写了to_url方法,以便在生成URL时对参数进行特定的处理。

to_url方法中,首先调用父类BaseConverterto_url方法来获取默认的URL参数字符串。然后,将获取到的默认值保存在变量val中,并返回它作为最终的URL参数字符串。

通过重写to_url方法,可以对参数进行任意的处理,并返回经过处理后的值,从而影响生成的URL结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146799.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试之Python基础学习

目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …

黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)

文章目录 1、什么是版本控制2、特点3、发展历史4、SVN和Git比较5、Git6、GitHub7、Gitee&#xff08;国产&#xff09;8、Git的基础命令 1、什么是版本控制 版本控制系统&#xff08; Version Control &#xff09;版本控制是一种管理和跟踪软件开发过程中的代码变化的系统。它…

树莓派4B串口通信配置方式

目录 1树莓派4B的安装&#xff1a; 1.1安装Serial与使用 1.1.1安装serial 1.1.2打开串口 1.2设置硬件串口为GPIO串口&#xff08;修改串口映射关系&#xff09; 1.2.1修改配置文件 2.1minicom串口 2.1.1安装minicom 这篇博客源于&#xff1a;工创赛。需要让树莓派与STM…

JDK11优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析

一、前言 上一期讲了JDK10的一些新特性&#xff0c;需要回顾的朋友们可以去该专栏回顾一下 这一期讲一讲JDK11的一些新功能 二、新增特性 以下是JDK 11的一些新增或变化的特性&#xff1a; 1. 纯字符串类型的 HTTP 客户端: JDK 11 引入了一个新的 HTTP 协议的客户端 API&…

【Java】super 关键字用法

目录 this与super区别 1.访问成员变量-示例代码 继承中构造方法的访问特点 2.访问构造方法-示例代码&#xff1a; 继承中成员方法访问特点 3.访问成员方法-示例代码&#xff1a; super 关键字的用法和 this 关键字相似 this : 代表本类对象的引用super : 代表父类存储空间…

使用 Elastic 输入包自定义你的数据摄取

作者&#xff1a;Ishleen Kaur Elastic 通过集成&#xff08;integrations&#xff09;实现了外部数据源和 Elastic Observability Solution 之间数据流的收集、转换和分析。 集成包通过封装多个组件来实现这一点&#xff0c;包括代理配置 (agent configuration)、数据收集输入…

利用DMA的触发循环实现eTMR的PWM周期计数

利用DMA的触发循环实现对eTMR的PWM周期计数 文章目录 利用DMA的触发循环实现对eTMR的PWM周期计数引言分析问题eTMR的调试模式ModulizationFTM的多次重载事件终极大招-使用触发链 解决问题确认DMAMUX中的eTMR相关触发源eTMR产生触发信号 软件总结参考文献 引言 最近在同客户一起…

Docker学习_镜像和容器篇

简介 Docker是一种容器化的技术&#xff0c;可以实现在一台宿主机电脑上运行多个不同的容器&#xff0c;每个容器之间都相互独立&#xff0c;具有完整的一套文件&#xff0c;网络和端口。 可以将其理解为一种虚拟机技术&#xff0c;只不过和VMware等虚拟化技术不同&#xff0…

【工具】idea 设置自动渲染注释

前言 需求&#xff1a;自动渲染文档注释&#xff0c;看源码更加舒服。 已知 crtl alt Q 可以 设置 尝试搜索 render&#xff0c;发现有启用 “渲染文档注释” 的地方 坐标 &#xff1a; Settings -> Editor-> Appearance

链表经典面试题(五)

求链表的公共结点 1.题目2.详细的图示3.详细注释和代码实现 1.题目 2.详细的图示 3.详细注释和代码实现 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//定义两个表示长度的指针,让它们指向headA和headB//我们暂时无法知道哪…

14:00面试测试岗,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

ElementUI之首页导航+左侧菜单

文章目录 一、Mock.js1.1.什么是Mock.js1.2.安装与配置1.3使用 二、登录注册跳转2.1.在views中添加Register.vue2.2.在Login.vue中的methods中添加gotoRegister方法2.3.在router/index.js中注册路由 三、组件通信&#xff08;总线&#xff09;3.1 在main.js中添加内容3.2.在com…

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 自动补全自定义拼音分词器自动补全查询案例&#xff1a;实现酒店搜索框自动补全自动补全的javaAPI实现搜索框自动补全 口述自动补全数据同步集群集群的分布式存储集群分布式查询集群故障转移 数据聚合 什么是聚合&#xff1f; 聚合…

chrome extensions mv3通过content scripts注入/获取原网站的window数据

开发插件的都知道插件的content scripts和top window只共享Dom不共享window和其他数据&#xff0c;如果想拿挂载在window的数据还有点难度&#xff0c;下面会通过事件的方式传递cs和top window之间的数据写一个例子 代码 manifest.json 这里只搞了2个js&#xff0c;content.…

【前端】ECMAScript6从入门到进阶

【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 &#xff08;1&#xff09;ECMAScript 6是什么 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff…

Excel·VBA分列、字符串拆分

看到一篇博客《VBA&#xff0c;用VBA进行分列&#xff08;拆分列&#xff09;的2种方法》&#xff0c;使用VBA对字符串进行拆分 目录 Excel分列功能将字符串拆分为二维数组&#xff0c;Split函数举例 将字符串拆分为一维数组&#xff0c;正则表达式举例 Excel分列功能 Sub 测…

[NOIP2012 提高组] 国王游戏(贪心,排序,高精度)

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆&#xff0c;国王邀请 n n n 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n n n 位大臣排成一排&…

ssl证书 阿里的域名,腾讯云的证书

目录 1.腾讯云申请ssl免费证书 2.去阿里云进行解析 3.回到腾讯云 4.nginx的配置 说明&#xff1a;阿里云的免费证书用完了&#xff08;每年可以申请20个&#xff09;&#xff0c;还有个项目要用证书&#xff0c;第三方的证书免费的都是90天的。看了下腾讯云业可以申请免费的…

C++代码示例:排列数简单生成工具

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;编译和运行命令结果总结参考资料作者的话 前言 C代码示例&#xff1a;排列数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

数据集划分——train_test_split函数使用说明

当我们拿到数据集时&#xff0c;首先需要对数据集进行划分训练集和测试集&#xff0c;sklearn提供了相应的函数供我们使用 一、讲解 快速随机划分数据集&#xff0c;可自定义比例进行划分训练集和测试集 二、官网API 官网API sklearn.model_selection.train_test_split(*a…