(七)Flask之路由转换器

news2024/11/28 6:42:12

引子:

from flask import Flask

app = 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 BaseConverter

app = Flask(__name__)


class RegexConverter(BaseConverter):
    """
    自定义URL匹配正则表达式
    """
    def __init__(self, map, regex):
        super(RegexConverter, self).__init__(map)
        self.regex = regex

    def 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.coloradmin.cn/o/1055723.html

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

相关文章

基于SpringBoot的知识管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户管理 文章分类 资料分类 文章信息 论坛交流 资料下载 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个…

毛玻璃带有光影效果的卡片

效果展示 页面结构组成 从效果展示可以看到&#xff0c;页面的主要元素是卡片&#xff0c;卡片的内容呈现上都是比较常规的布局&#xff0c;只是卡片上带有光影效果。 CSS / JavaScript 知识点 transformVanillaTilt.js 使用 页面基础结构实现 <div class"contain…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT。 Chapter 10 Mining Social-Network Graphs The essential characteristics of a social network are: There is a collection of entities that participate in the network. Typically, these entiti…

HDR-ISP_unpack_depwl_01_20231002

https://github.com/JokerEyeAdas/HDR-ISP/tree/main 1.unpack&#xff1a;解析raw图 (1)unpack&#xff1a;2个字节1个像素 (2)mipi10&#xff1a;5个字节4个像素 [p1 9:2][p2 9:2][p3 9:2][p4 9:2][(p1 1:0)(p2 1:0)(p3 1:0)(p4 1:0)] (3)mipi12&#xff1a;3个字节2个像…

音频编辑软件Steinberg SpectraLayers Pro mac中文软件介绍

Steinberg SpectraLayers Pro mac是一款专业的音频编辑软件&#xff0c;旨在帮助音频专业人士进行精细的音频编辑和声音处理。它提供了强大的频谱编辑功能&#xff0c;可以对音频文件进行深入的频谱分析和编辑。 Steinberg SpectraLayers Pro mac软件特点 1. 频谱编辑&#xff…

基于or-tools的人员排班问题建模求解(JavaAPI)

使用Java调用or-tools实现了阿里mindopt求解器的案例&#xff08;https://opt.aliyun.com/platform/case&#xff09;人员排班问题。 这里写目录标题 人员排班问题问题描述数学建模编程求解&#xff08;ortoolsJavaAPI&#xff09;求解结果 人员排班问题 随着现在产业的发展&…

Spring(JavaEE进阶系列1)

目录 前言&#xff1a; 1.Servlet与Spring对比 2.什么是Spring 2.1什么是容器 2.2什么是IoC 2.3SpringIoC容器的理解 2.4DI依赖注入 2.5IoC与DI的区别 3.Spring项目的创建和使用 3.1正确配置Maven国内源 3.2Spring的项目创建 3.3将Bean对象存储到Spring&#xff08…

21.本地存储

目录 1 保存 wx.setStorageSync() 2 获取 wx.getStorageSync() 3 删除指定的 wx.removeStorageSync() 4 清空所有 wx.clearStorageSync() 1 保存 wx.setStorageSync() 第一个参数是键&#xff0c;第二个参数是值&#xff0c;我放在生命周期函数中了&#xff0c;所以一…

怒刷LeetCode的第17天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;过滤和排序 方法二&#xff1a;迭代 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯算法 方法二&#xff1a;动态规划 方法三&#xff1a;DFS剪枝 方法四&#xff1a;动态规划状态压缩 方…

基于SpringBoot的高校学科竞赛平台

目录 前言 一、技术栈 二、系统功能介绍 竞赛题库管理 竞赛信息管理 晋级名单管理 往年成绩管理 参赛申请管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步…

【机器学习笔记】

文章目录 1.优化器讲解 1.优化器讲解

超详细的Pycharm.2023下载与安装教程

Pycharm.2023下载与安装教程 Pycharm下载Pycharm安装 Pycharm下载 Pycharm官网下载地址&#xff1a; https://www.jetbrains.com/pycharm/download/?sectionwindows#sectionwindows 进入如下界面&#xff1a;一般分为专业版本和社区版本&#xff0c;平时做深度学习的话社区版…

Ubuntu镜像源cn.arichinve.ubuntu.com不可用原因分析和解决

文章目录 Ubuntu查看系统版本Ubuntu更新系统不能更新Ubuntu查看APT更新源配置cn.archive.ubuntu.com已经自动跳转到清华镜像站Ubuntu变更镜像源地址备份原文件批量在VIM中变更 Ubuntu国内镜像站推荐推荐阅读 今天想要在Ubuntu环境下搭建一个测试环境&#xff0c;进入Ubuntu系统…

基于51单片机NEC协议红外遥控发送接收仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

基于51单片机NEC协议红外遥控发送接收仿真设计 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机NEC协议红外遥控发送接收仿真设计 51单片机红外发送接收仿真设计( proteus仿真程序原理图报告讲解视频…

查看react内置webpack版本的方法

yarn list --pattern webpack npm ls --pattern webpack

力扣-303.区域和检索-数组不可变

Idea 需计算数组nums在下标right 和 left-1 的前缀和&#xff0c;然后计算两个前缀和的差即可。 需要注意的是&#xff0c;当left为0的时候&#xff0c;如果还是left-1则会发生数组访问越界错误。 AC Code class NumArray { public:vector<int> sum;NumArray(vector<…

嵌入式学习笔记(41)SD卡启动详解

内存和外存的区别&#xff1a;一般是把这种RAM(random access memory,随机访问存储器&#xff0c;特点是任意字节读写&#xff0c;掉电丢失)叫内存&#xff0c;把ROM&#xff08;read only memory&#xff0c;只读存储器&#xff0c;类似于Flash SD卡之类的&#xff0c;用来存储…

基于YOLOv8的安全帽检测系统

1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前YOLO成功基础上&#xff0c;并引入了新功能和改进&#xff0c;以进一步提升性能和灵活…

lvgl不能显示图片,但可以显示按键?

AT32F403A, IAR, ST7735S, LVGL8.3。 一、现象&#xff1a; 本来想着用LVGL做一个摄像头的显示功能 切换动态。可是死活实现不了功能。 因为移植好LVGL后&#xff0c;首先测试了显示按键&#xff0c;功能正常&#xff0c;以为是一切正常。在模拟器上调试效果完成后&#xf…

复习Day07:链表part03:21. 合并两个有序链表、2. 两数相加

之前的blog链接&#xff1a;https://blog.csdn.net/weixin_43303286/article/details/131700482?spm1001.2014.3001.5501 我用的方法是在leetcode再过一遍例题&#xff0c;明显会的就复制粘贴&#xff0c;之前没写出来就重写&#xff0c;然后从拓展题目中找题目来写。辅以Lab…