Flask入门学习——自定义一个url转换器
我们知道,flask的url规则是可以添加变量部分的,这个参数变量是写在尖括号里的,比如:/item/<id>/
,如果需要指出参数的类型要符合<converter:vaiable_name>
格式的,其中,converter有几种类型:
- string:接受不含有‘/’的文本
- int:接受整数
- float:接受浮点型
- path:接受含有‘/’的文本串
- uuid:只接受uuid串
而当没有符合的转换器时,就需要自己定义一个转换器供我们使用,完成它只需要三步:
1.自定义转换器
2.将自定义的转换器添加到flask的应用中
3.使用转换器
现在,定义一个类似127.0.0.1:5000/flask+aaa
这样的。
import urllib.parse as par
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1.自定义转换器
class ListConverter(BaseConverter):
def __init__(self, url_map, separator='+'):
super(ListConverter, self).__init__(url_map) # 调用父类的构造方法
self.separator = par.unquote(separator) # 将自定义转换器参数保存在对象的属性中,flask回去使用这个
def to_python(self, value):
return value.split(self.separator)
def to_url(self, values):
return self.separator.join(super(BaseConverter, self).to_url(value) for value in values)
# 2.将自定义的转换器添加到flask的应用中
app.url_map.converters['list'] = ListConverter
# 3.使用
@app.route('/list1/<list:page_names>/')
def list1(page_names):
return 'Separator: {} {}'.format('+', page_names)
# 3.使用
@app.route('/list2/<list(separator=u"|"):page_names>/')
def list2(page_names):
return 'Separator: {} {}'.format('|', page_names)
if __name__ == '__main__':
app.run(debug=True)
当我们访问http://127.0.0.1:5000/list1/a+b/
和http://127.0.0.1:5000/list1/a|b/
就能实现同样的功能了。要注意:自定义转换器需要继承自BaseConverter类,并且设置to_python(把路径转换成一个Python对象)和to_url(把参数转换成符合url的格式)两个方法。
另一个转换器-----自定制正则路由匹配:
from flask import Flask,url_for
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
# 添加到converts中
app.url_map.converters['regex'] = RegexConverter
# 进行使用
@app.route('/index/<regex("\d+"):nid>',endpoint='xx')
def index(nid):
url_for('xx',nid=123)
return "Index"
if __name__ == '__main__':
app.run()
Flask入门学习——自定义一个url转换器的更多相关文章
- Flask入门之自定义过滤器(匹配器)
1. 动态路由的匹配器? 不知道这种叫啥名,啥用法,暂且叫做匹配器吧. Flask自带的匹配器可以说有四种吧(保守数字,就我学到的) 动态路由本身,可以传任何参数字符串或者数字,如:<user ...
- [python][flask] Flask 入门(以一个博客后台为例)
目录 1.安装 1.1 创建虚拟环境 1.2 进入虚拟环境 1.3 安装 flask 2.上手 2.1 最小 Demo 2.2 基本知识 3.解构官网指导 Demo 3.1 克隆与代码架构分析 3.2 ...
- java struts2入门学习---自定义类型转换
自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的. 比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区) 这里涉及到的知识点即是将String转换为任 ...
- Flask入门学习——蓝图Blueprint
flask蓝图可以实现应用程序的模块化,即通常作用于相同的url前缀,eg:/user/id,/user/profile等类似这样,可以放在一个模块当中,这样会让应用更加清晰便于开发与维护. 这里有个 ...
- angualar入门学习-- 自定义指令 认识属性
个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用 2.作为一个元素的属性来使用 3.作为一个元素的类来使用 4.作为注释来使用 一.创建指令 angul ...
- Tensorflow_入门学习_2_一个神经网络栗子
3.0 A Neural Network Example 载入数据: from tensorflow.examples.tutorials.mnist import input_data mnist ...
- angualar入门学习-- 自定义指令 指令编译执行过程
3个阶段: 一.加载阶段 加载angular.js的源码,找到ng-app确定应用边界范围. 二.编译阶段 compile 查找所有指令,保存在一个列表中 对所有指令按优先级(property属性值) ...
- Flask入门学习——配置参数的管理方式
一般来说有这么几种方式: 直接操作config的字典对象 app.config["DEBUG"] = True 使用配置文件加载,直接传入文件名 app.config.from_p ...
- flaks-自定义url转换器
flaks-自定义url转换器 from flask import Flask, url_for from werkzeug.routing import BaseConverter app = Fl ...
随机推荐
- Mycat分布式数据库架构解决方案--Linux安装运行Mycat
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Myc ...
- cacti1.2.7安装教程+Centos7|Cacti1.2.x+Centos7+Spine1.2.7零基础手把手教学
cacti1.2.7安装教程+Centos7|Cacti1.2.x+Centos7+Spine1.2.7零基础手把手教学 教程地址: 链接:http://note.youdao.com/notesha ...
- egg 框架自动创建数据库表结构
// {app_root}/app.js module.exports = app => { app.beforeStart(async () => { // 从配置中心获取 MySQL ...
- Nginx专题(1):Nginx之反向代理及配置
摘要:本文从Nginx的概念出发,分别从反向代理的概念.优势.配置代码3个方面介绍了Nginx的特性之一反向代理. 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第一期-宜信支付结算八方 ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- [考试反思]0811NOIP模拟测试17:虚无
(sdfz未参加,也就是一共就51个人) 也不粘具体排名了,只写分数线. []220 []201 []194 [5]181 [10]141 [15]132 [20]122 [25]116 [30]10 ...
- CSPS模拟 44
状态不是很好吧 这套和前边是一套的, skyh在我旁边AK,好像开了三个对拍又在拼小人 T3 正解没调出来,暴力又忘交了qwq 当时心情都要爆炸了 T1 区间$gcd$乘区间长度的最大值 暴力是$n^ ...
- 网页文件打包成.exe可执行文件
网页文件不止可以通过浏览器打开,也可以通过打包程序打包成.exe桌面可执行程序,这样写的网页文件就可以像桌面应用一样打开了.方法如下: 工具:NW.js.Enigma Virtual Box.资源编辑 ...
- 「Luogu 1525」关押罪犯
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...
- c++中while(cin>>str)和ctrl z的相关问题探讨
对于while (cin>>str)和ctrl z的问题,网上有以下解释: -------------------------------------------------------- ...