flask第十一篇——自定义url转换器
首先和大家说一下flask的组成,flask其实是werkzeug(路由和http处理)
+SQLAlchemy(数据库)
+Jinja2(模板)
组成的,今天我们要看到的东西就是`werkzeug`里面的内容。
我们在代码里导入from werkzeug.routing import BaseConverter
,然后进入BaseConverter
中看一下这个方法的源码:
其中to_python
方法的作用就是将你传过去的参数转换成对应类型的数据,比如你设置传参是uuid类型数据,那么当你传参以后,就会调用to_python方法,将参数转换为对应的uuid类型。
此外,下面还有PathConverter
、UUIDConverter
等,再往下,我们会看到,原来这里写好了一个映射,每当我们在url中传入指定类型的参数时,系统会自动的来寻找这里的映射:
那么我们现在想自定义url转换器——我们希望传入的是list类型的数据,那么我们就可以参照上面代码里的形式,定义to_python
和to_url方法,并添加到DEFAULT_CONVERTERS映射中去。现在我们假定获取到的参数是[1, 2, 3],我们要把它以1+2+3的形式在url中
,那么我们to_python
方法的任务就是将url中的1+2+3
中的 +去掉;我们知道python的split
方法可以去掉 +,但是它返回的是一个list列表,而url中地址不可能出现列表,即你不可能看到过地址是127.0.0.1:500/[1,2,3]/
这种形式,所以我们另一个任务就是将数组转换成我们需要的`1+2+3`这种形式。注意,我们的url地址参数是在代码里传的就是flask.url_for('detail', params=[1, 2, 3]),就是说地址是在代码里传,
我们已经想好了页面的地址:
# coding: utf-8
from flask import Flask
from werkzeug.routing import BaseConverter
import flask
app = Flask(__name__) # type: Flask
app.debug = True
# 根目录
@app.route('/')
def hello_world():
return 'Hello World!'
class ListConverter(BaseConverter):
def to_python(self, values):
"""
将url中的参数转换为我们需要的数据类型
"""
# split方法就是去掉加号并返回list类型数据
tmp = values.split('+')
print 'tmp: %s' % tmp
return tmp
def to_url(self, values):
"""
将[1,2,3]转换成1+2+3
"""
# 遍历列表values中的数据,以+连接,最后tmp1的值即1+2+3
# BaseConverter.to_url是对url进行编码
tmp1 = '+'.join([BaseConverter.to_url(self, value) for value in values])
print 'tmp1:%s' % tmp1
return tmp1
# 将写好的类注册到DEFAULT_CONVERTERS
app.url_map.converters['list'] = ListConverter
@app.route('/detail/<list:params>/')
def detail(params):
print 'parmas:%s' % params
return 'success for url'
with app.test_request_context():
print 'detail函数的url是:%s' % flask.url_for('detail', params=[1, 2, 3])
if __name__ == '__main__':
app.run()
执行代码以后刷新页面可以看到:
控制台
tmp1:1+2+3
detail函数的url是:/detail/1+2+3/
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
tmp1:1+2+3
detail函数的url是:/detail/1+2+3/
* Debugger is active!
* Debugger PIN: 176-123-878
127.0.0.1 - - [15/Mar/2018 00:21:23] "GET /detail/1+2+3/ HTTP/1.1" 200 -
tmp: [u'1', u'2', u'3']
params:[u'1', u'2', u'3']
tmp: [u'1', u'2', u'3']
127.0.0.1 - - [15/Mar/2018 00:23:28] "GET /detail/1+2+3/ HTTP/1.1" 200 -
params:[u'1', u'2', u'3']
页面
地址:http://127.0.0.1:5000/detail/1+2+3/
页面显示:success for url
这里有点不好理解,很难理解,大家看懂更好,看不懂就知道有这么回事就好,后面还会有这里的说明的。
请关注微信公众号:自动化测试实战 ,查看清晰排版及图片
flask第十一篇——自定义url转换器的更多相关文章
- flask第十二篇——自定义url转换器【2】
继续昨天的话题,今天我们来写一个手机号的转换器,方便大家理解 我们在`BaseConverter`源码里看到好多这种正则表达式: 正则表达式的目的就是规范匹配的规则,现在我们写一个简单的匹配手机号的正 ...
- python_flask 基础巩固(自定义URL转换器)
自定义URL转换器(在BaseConverter类外定义)from werkzeug.routing import BaseConverter定义类继承BaseConverter 实现类app.url ...
- django 自定义url转换器
django内置的url转换器,包括有int.str.uuid等等.但是有时候他们不能满足我们的需求,因此就需要使用自定义url转换器.自定义url转换器的五步:1.定义一个类,直接继承自object ...
- flask第二十一篇——练习题
自定义url转化器 实现一个自定义的URL转换器,这个转换器需要满足的是获取从多少到多少的url,例如,你输入的地址是http://127.0.0.1:8000/1-5/,那么页面返回[1,2,3,4 ...
- python3 Flask -day4 自定义url转换器
url传参可以限定参数的数据类型,例如:限定user_id数据类型为int @app.route('/user/<int:user_id>') def my_list(user_id): ...
- 4、Flask实战第4天:自定义url转换器
url传参可以限定参数的数据类型,例如:限定user_id数据类型为int @app.route('/user/<int:user_id>') def my_list(user_id): ...
- flask 自定义url转换器
from werkzeug.routing import BaseConverter app = Flask(__name__) class TeleConveter(BaseConverter): ...
- Restful framework【第十一篇】url路由控制
基本使用 -url控制 -传统的url配置 url(r'^books/$', views.BookView.as_view()), url(r'^books/(?P<pk>\d+)$', ...
- 自制URL转换器
自定义 url 转换器五个步骤: 定义一个类. 在类中定义一个属性 regex ,这个属性是用来保存 url 转换器规则的正则表达式. 实现 to_python(self,value) 方法, ...
随机推荐
- IE类兼容一
X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的.通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置. 在网页中指定的模式优 ...
- [Vue]组件——通过$emit为组件自定义事件
1.在定义组件时调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件enlarge-text: Vue.component('blog-post', { props: ['post' ...
- Mercurial的使用心得
本文发表地址:http://www.xiabingbao.com/mercurial/2015/01/22/mercurial-understanding/ 本人接触版本控制的历史 在很久很久以前,我 ...
- 分布式MySql
# 分布式MySql 部署方案---1. 解决方案2. 系统环境3. mysql 主从备份4. MyCat 中间件搭建5. haproxy 负载代理6. keepalived 解决单点故障7. myc ...
- Linux命令详解-touch
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a 或- ...
- Linux命令详解-cp
cp 命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在, 就会询问是否覆盖,不管你是否使用-i参数.但是如 ...
- JAVA之Map使用
参考: http://blog.csdn.net/laixiaobailing/article/details/41644327
- 伪基站,卒于5G——本质上是基于网络和UE辅助的伪基站检测,就是将相邻基站的CI、信号强度等信息通过测量报告上报给网络,网络结合网络拓扑、配置信息等相关数据,对所有数据进行综合分析,确认在某个区域中是否存在伪基站
伪基站,卒于5G from:https://www.huxiu.com/article/251252.html?h_s=h8 2018-07-05 21:58收藏27评论6社交通讯 本文来自微 ...
- RabbitMQ(6) 集群部署
单节点部署 rabbitmq单节点部署比较简单,可以使用apt-get等工具快速安装部署. wget -O- https://www.rabbitmq.com/rabbitmq-release-sig ...
- ROW_NUMBER() OVER(PARTITION BY)
select * from (select *,ROW_NUMBER() OVER(PARTITION BY GoodsID ORDER BY IsMain desc,OrderNum) as Mai ...