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使用PIL库实现验证码图片的方法
Mar 11 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
python hash每次调用结果不同的原因
Nov 21 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
python自动点赞功能的实现思路
Feb 26 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 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程序
2006/10/09 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
医学毕业生自我鉴定
2013/10/30 职场文书
教学改革实施方案
2014/03/31 职场文书
个人校本研修方案
2014/05/26 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
警用民用对讲机找不同
2022/02/18 无线电
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js