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和C++求解方法
Aug 20 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python 错误和异常代码详解
Jan 29 Python
python主线程捕获子线程的方法
Jun 17 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
python多进程控制学习小结
Oct 31 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
python多线程扫描端口(线程池)
Sep 04 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
Python实现自定义读写分离代码实例
Nov 16 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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生成随机数或者字符串的代码
2008/09/05 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
js继承的实现代码
2010/08/05 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
python数据结构之二叉树的遍历实例
2014/04/29 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
文明倡议书范文
2014/04/15 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
风之谷观后感
2015/06/11 职场文书
Spring Bean是如何初始化的详解
2022/03/22 Java/Android