flask框架自定义url转换器操作详解


Posted in Python onJanuary 25, 2020

本文实例讲述了flask框架自定义url转换器。分享给大家供大家参考,具体如下:

什么是url转换器

可以指定url的规制,对url做一定的限制。

自带的url转换器

可以参考我的上一篇博客: flask?url与重定向详解

自定义url转换器

首先我们提一个需求,根据需求来写代码,现在我们假设一个url需要满足电话号码的格式才能访问我们的函数视图,例如这样的url: 127.0.0.1:5000/user/<电话号码>/.

# 首先导入BaseConverter
from werkzeug.routing import BaseConverter
from flask import Flask
app = Flask(__name__)
# 然后我们写一个类,需要继承BaseConverter这个类
class TelphoneConverter(BaseConverter):
 # 然后将我们url的规则写到regex这个属性上,必须为regex,正则表达式
 # 以1开始,第二位数只能是3458中的一个,然后后面随便跟9个数字
 regex = '1[3458]\d{9}'
# 然后我们需要注册我们自定义的转换器
# 'tel': 为我们给这个转换器取的名字,我们使用的时候就会使用这个名字
# 'TelephoneConverter': 为'tel'这个转换器对应的类,也就是我们上面写的类,当我们使用'tel'时,就会去使用这个类中的regex属性
app.url_map.converters['tel'] = TelephoneConverter
# 然后使用我们的tel转换器
@app.route('/user/<tel:telephone>')
def tel_demo(telephone):
 return "你的电话号码是:%s" % telephone

然后我们就可以输入网址测试了,如果我们输入的规则不满足我们写的正则表达式的话,就会出现404页面。

在上面的tel转换器中,我们只是写了规则,我们还可以对url进行一些自定义的处理,然后再传给我们的视图函数.

这个时候就会使用到我们的to_python和to_url方法了

需求:当输入的url为127.0.0.1/a+b/这样的时候,我们想在视图函数中拿到的时候就直接是一个列表['a','b'],而不用我们每次都去自己转换。而当我们使用url_for闯入参数的时候,我们直接传入['a','b'],也能直接给我们变成a+b这种形式。

代码如下:

from flask import Flask
from flask import url_for
from werkzeug.routing import BaseConverter
class ListConverter(BaseConverter):
 # 重写to_python方法,value就是url传入的参数,也就是我们url中传入的参数会经过这个方法处理之后,
 # 然后再返回给我们的视图函数,也就是我们在视图函数中拿到的值是经过这个函数处理过后的值
 def to_python(self,value):
 return value.split('+')
 # 重写to_url方法,value就是我们在使用url_for的时候传入的参数,也就是说我们传入的参数会经过这个方法的处理,再变成url
 def to_url(self,value):
 return "+".join(value)
# 然后我们还是要注册我们的转换器
app.url_map.converters['list'] = ListConverter
# 然后编写一个视图来测试
@app.route('/index/')
def index():
 return url_for('board',boards=['a','b'])
@app.route('/<list:boards>/')
def demo(boards):
 print(boards)
 return 'boards is ' + str(boards)

然后启动项目,当我们访问127.0.0.1:5000/index/的时候,我们就能看到/a+b/,这个就是to_url函数起作用了。而当我们在浏览中输入127.0.01:5000/a+b/,就能看到了一个列表。这也就是我们的to_python起作用了。

总结:

  • 自定义url转换器需要继承自BaseConverter这个类
  • url的规则需要重写regex这个属性(写正则表达式)
  • to_python方法是在url中的参数传入视图函数之前,会对参数进行处理
  • to_url方法在使用url_for的时候,会对传入的参数进行处理,再转化为url
  • 最后,一定要将自定义的url转换器添加至app.url_map.converters中

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

Python 相关文章推荐
使用python实现扫描端口示例
Mar 29 Python
python实现在目录中查找指定文件的方法
Nov 11 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python try 异常处理(史上最全)
Mar 07 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
python之列表推导式的用法
Nov 29 Python
tensorflow常用函数API介绍
Apr 19 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Keras之自定义损失(loss)函数用法说明
Jun 10 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
Python Django ORM连表正反操作技巧
Jun 13 Python
常用python爬虫库介绍与简要说明
Jan 25 #Python
flask框架url与重定向操作实例详解
Jan 25 #Python
flask框架蓝图和子域名配置详解
Jan 25 #Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 #Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 #Python
在keras中获取某一层上的feature map实例
Jan 24 #Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 #Python
You might like
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
python实现跨文件全局变量的方法
2014/07/07 Python
Python文件处理
2016/02/29 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
EJB的激活机制
2013/10/25 面试题
如何定义一个可复用的服务
2014/09/30 面试题
班组安全员工作职责
2014/02/01 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
新年团拜会主持词
2014/04/02 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
大客户经理岗位职责
2015/04/09 职场文书
python编写函数注意事项总结
2021/03/29 Python
Python中的min及返回最小值索引的操作
2021/05/10 Python
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs