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通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
python简单实现刷新智联简历
Mar 30 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
python实现简易通讯录修改版
Mar 13 Python
linux安装python修改默认python版本方法
Mar 31 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
Python基于内置函数type创建新类型
Oct 22 Python
Python IO文件管理的具体使用
Mar 20 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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
python实现斐波那契递归函数的方法
2014/09/08 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
django将数组传递给前台模板的方法
2019/08/06 Python
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
上班早退检讨书
2014/01/09 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
电影红河谷观后感
2015/06/11 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
导游词之西安骊山
2019/12/20 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
如何解决php-fpm启动不了问题
2021/11/17 PHP
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript