(七)Flask之路由转换器

引子:

python 复制代码
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中的动态部分。这些转换器允许我们指定特定类型的参数,并限制其匹配的模式。

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

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

python 复制代码
# 字符串
@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)及其对应的类:

python 复制代码
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的正则路由转换器,并将其应用于路由规则。

python 复制代码
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. 定义视图函数:

    python 复制代码
    @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__中的两个参数:map和regex。

  • 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方法中,首先调用父类BaseConverter的to_url方法来获取默认的URL参数字符串。然后,将获取到的默认值保存在变量val中,并返回它作为最终的URL参数字符串。

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

相关推荐
高频因子挖掘机7 分钟前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD5 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
VidDown7 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
余槐i8 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF10 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉