Flask学习(四):路由转换器

默认的路由转换器:

string  (缺省值) 接受任何不包含斜杠的文本
int接受正整数
float接受正浮点数  
path类似 string,但可以包含斜杠
uuid接受 UUID 字符串  


代码示例:

@app.route('/user/<username>')
def show_user_profile(username):return 'User %s' % escape(username)@app.route('/post/<int:post_id>')
def show_post(post_id):return 'Post %d' % post_id@app.route('/path/<path:subpath>')
def show_subpath(subpath):return 'Subpath %s' % escape(subpath)

自定义路由转换器:

from flask import Flask
# 导入所有转换器的基类BaseConverter
from werkzeug.routing import BaseConverter
# 生成实例对象
app = Flask(__name__)# 创建自定义转换器 继承转换器的基类BaseConverter
class RegexConverter(BaseConverter):# 重写构造方法传入url_map,regexdef __init__(self, url_map, regex):super().__init__(map=url_map)self.regex = regex# 将定义的 RegexConverter 添加到 Flask 应用的 URL 转换器字典中,并为其分配了一个键 're'。可以在路由中使用 re:<pattern> 来使用这个转换器。
app.url_map.converters['re'] = RegexConverter# re中传入正则表达式 校验手机号格式是11位
@app.route("/index1/<re(r'\d{11}'):mobile>")
def index1(mobile):print(mobile)return "Index"if __name__ == "__main__":app.run()

注:通过app.url_map.converters['re'] = RegexConverter注册自定义转换器后,打印出的结果如下:

print(app.url_map.converters)
#结果:
{'default': <class 'werkzeug.routing.converters.UnicodeConverter'>, 'string':  <class 'werkzeug.routing.converters.UnicodeConverter'>, 'any':  <class 'werkzeug.routing.converters.AnyConverter'>, 'path':  <class 'werkzeug.routing.converters.PathConverter'>,'int':  <class 'werkzeug.routing.converters.IntegerConverter'>, 'float':  <class 'werkzeug.routing.converters.FloatConverter'>, 'uuid':  <class 'werkzeug.routing.converters.UUIDConverter'>, #自定义转换器,上面为默认转换器're':  <class '__main__.RegexConverter'>}
-----------------------------------------------------------------------
#源代码中的映射关系:
#: the default converter mapping for the map.
DEFAULT_CONVERTERS: t.Mapping[str, type[BaseConverter]] = {"default": UnicodeConverter,"string": UnicodeConverter,"any": AnyConverter,"path": PathConverter,"int": IntegerConverter,"float": FloatConverter,"uuid": UUIDConverter,
}

所有转换器的基类:

class BaseConverter:# 匹配多个不包含/的字符串regex = "[^/]+"# 权重weight = 100part_isolating = True# 类方法 子类被创建的时候会被调用def __init_subclass__(cls, **kwargs: t.Any) -> None:super().__init_subclass__(**kwargs)# __dict__就是用来存储对象属性的一个字典,键是属性名,值是属性的值# 重写了regex属性并没有重写part_isolating属性if "regex" in cls.__dict__ and "part_isolating" not in cls.__dict__:# 设置part_isolating 的值cls.part_isolating = "/" not in cls.regex# 构造方法def __init__(self, map: Map, *args: t.Any, **kwargs: t.Any) -> None:self.map = map# 将 URL 中的字符串值转换为 Python 中使用的值def to_python(self, value: str) -> t.Any:return value# 将 Python 中的值转换为 URL 中使用的字符串def to_url(self, value: t.Any) -> str:# safe = https://url.spec.whatwg.org/#url-path-segment-stringreturn quote(str(value), safe="!$&'()*+,/:;=@")

基类中的to_python方法,可以在子类中进行重写,并按照需求将url进行处理转换成需要的值:

from flask import Flask
from werkzeug.routing import BaseConverterapp = Flask(__name__)class RegexConverter(BaseConverter):# 重写的to_python方法,将 URL 中的字符串值转换为 Python 中使用的值def to_python(self, value):# 返回参数通过+ 分割之后的数据return value.split('+')app.url_map.converters['re'] = RegexConverter#http://127.0.0.1:5000/index1/12+56
@app.route("/index1/<re:info>")
def index(info):print(info)return "Index"if __name__ == "__main__":app.run()

执行的结果:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

50、东北大学、阿尔伯塔大学:Hi-GCN从2个层次角度进行图学习,用来诊断脑部疾病[你这和MVS-GCN套娃呢?]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2020年10.24日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑连接网络已被用于神经系统疾病的分类&#xff0c;如自闭症…

备战蓝桥杯Day27 - 省赛真题-2023

题目描述 大佬代码 import os import sysdef find(n):k 0for num in range(12345678,98765433):str1 ["2","0","2","3"]for x in str(num) :if x in str1:if str1[0] x:str1.pop(0)if len(str1) ! 0:k1print(k)print(85959030) 详…

vue防止用户连续点击造成多次提交

中心思想&#xff1a;在第一次提交的结果返回前&#xff0c;将提交按钮禁用。 方法一&#xff1a;给提交按钮加上disabled属性&#xff0c;在请求时先把disabled属性改成true&#xff0c;在结果返回时改成false 方法二&#xff1a;添加loading遮罩层&#xff0c;可以直接使用e…

什么是MVC三层结构

1.MVC&#xff08;三层结构&#xff09; MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于将应用程序的逻辑和界面分离成三个不同的组件。每个组件负责特定的任务&#xff0c;从而提高代码的可维护性和可扩展性。 以前的模式。 遇到…

【开源工程】超经典开源项目数字孪生机房~数字机房楼解决方案

飞渡科技数字孪生IDC机房管理平台&#xff0c;综合运用数字孪生、大数据、物联网等技术&#xff0c;对机房楼宇建筑、机房空间、机柜设备等景观进行3D可视化呈现&#xff0c;对接3D机房动环监控系统&#xff0c;辅助管理人员远程掌握机房机柜信息、PUE信息以及安防情况&#xf…

windows使用docker运行TP6使用swoole内置http服务

1&#xff0c;下载docker-Windows客户端 下载地址&#xff1a;https://www.docker.com/products/docker-desktop docker --version #查看docker版本 docker-compose --version #查看docker-compose版本 2&#xff0c;安装环境 使用一键安装包&#xff1a;https://gitee.com/yes…

常青内容与病毒式内容——哪个更适合 SEO?

常青内容是经得起时间考验的内容&#xff0c;而病毒式内容则是利用特定时代潮流的内容。 如果你曾经考虑过为网站添加内容&#xff0c;你可能听说过常青内容和病毒式内容这两个词。这两个词涵盖了网站所需的基本内容类型。 那么&#xff0c;这两者之间有什么区别&#xff1f;…

PCL 高斯投影反算:高斯投影坐标转大地坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据PCL 高斯投影反算:高斯投影坐标转大地坐标(C++详细过程版)由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理

SpringBoot3学习记录(有ssm基础)

目录 一、SpringBoot3 介绍 SpringBoot3 简介 SpringBoot3 快速入门 入门总结 1.为什么依赖不需要写版本 2.Startrer&#xff08;启动器&#xff09;是什么 3.SpringBootApplication 二、SpringBoot3 配置文件 统一配置管理 使用yaml配置文件&#xff08;推荐&#x…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程

原文链接&#xff1a;基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx7&snd71869f1290d0ef9dd7fd3f74dd7ca33&chksmfa823ef0cdf5b7e655af5e773a3d3a1b200632a5981f99fe72f0…

Hadoop大数据应用:Linux 部署 MapReduce 与 Yarn

目录 一、实验 1.环境 2.Linux 部署 MapReduce 3.Linux 部署 Yarn 4.Linux 调用大数据集群分析数据 二、问题 1.hadoop 的启动和停止命令 2.HDFS 使用命令 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xf…

easyexcel读和写excel

请直接看原文: JAVA使用easyexcel操作Excel-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 之前写过一篇《JAVA操作Excel》&#xff0c;介绍了jxl和poi读写Excel的实现&am…