首先和大家说一下flask的组成,flask其实是werkzeug(路由和http处理)+SQLAlchemy(数据库)+Jinja2(模板)组成的,今天我们要看到的东西就是`werkzeug`里面的内容。

我们在代码里导入from werkzeug.routing import BaseConverter,然后进入BaseConverter中看一下这个方法的源码:

其中to_python方法的作用就是将你传过去的参数转换成对应类型的数据,比如你设置传参是uuid类型数据,那么当你传参以后,就会调用to_python方法,将参数转换为对应的uuid类型。

此外,下面还有PathConverterUUIDConverter等,再往下,我们会看到,原来这里写好了一个映射,每当我们在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转换器的更多相关文章

  1. flask第十二篇——自定义url转换器【2】

    继续昨天的话题,今天我们来写一个手机号的转换器,方便大家理解 我们在`BaseConverter`源码里看到好多这种正则表达式: 正则表达式的目的就是规范匹配的规则,现在我们写一个简单的匹配手机号的正 ...

  2. python_flask 基础巩固(自定义URL转换器)

    自定义URL转换器(在BaseConverter类外定义)from werkzeug.routing import BaseConverter定义类继承BaseConverter 实现类app.url ...

  3. django 自定义url转换器

    django内置的url转换器,包括有int.str.uuid等等.但是有时候他们不能满足我们的需求,因此就需要使用自定义url转换器.自定义url转换器的五步:1.定义一个类,直接继承自object ...

  4. flask第二十一篇——练习题

    自定义url转化器 实现一个自定义的URL转换器,这个转换器需要满足的是获取从多少到多少的url,例如,你输入的地址是http://127.0.0.1:8000/1-5/,那么页面返回[1,2,3,4 ...

  5. python3 Flask -day4 自定义url转换器

    url传参可以限定参数的数据类型,例如:限定user_id数据类型为int @app.route('/user/<int:user_id>') def my_list(user_id): ...

  6. 4、Flask实战第4天:自定义url转换器

    url传参可以限定参数的数据类型,例如:限定user_id数据类型为int @app.route('/user/<int:user_id>') def my_list(user_id): ...

  7. flask 自定义url转换器

    from werkzeug.routing import BaseConverter app = Flask(__name__) class TeleConveter(BaseConverter): ...

  8. Restful framework【第十一篇】url路由控制

    基本使用 -url控制 -传统的url配置 url(r'^books/$', views.BookView.as_view()), url(r'^books/(?P<pk>\d+)$', ...

  9. 自制URL转换器

    自定义 url 转换器五个步骤: 定义一个类. 在类中定义一个属性  regex  ,这个属性是用来保存 url 转换器规则的正则表达式. 实现  to_python(self,value)  方法, ...

随机推荐

  1. Location对象常用知识

    产品终于上线,后期主要是优化了.在开发过程中用到了很多location对象的知识,趁现在有时间先整理一下. Location 对象存储在 Window 对象的 Location 属性中,可通过wind ...

  2. JavaScript权威指南--语句

    知识要点 在javascript中,表达式是短语,那么语句(statement)就是整句或命令.表达式计算出一个值,但语句用来执行以使某件事发生. 1.表达式语句 具有副作用的表达式是JavaScri ...

  3. mongodb安装、运行

    1.下载安装: 切换到:/usr/local/ mkdir -p mongodb groupadd -g 800 mongodb useradd -u 801 -g mongodb mongodb c ...

  4. Node-Media-Server

    Node-Media-Server (相对稳定可用性高) 主要应用Node.js 实现的RTSP(结合ffmpeg)/RTMP/HTTP/WebSocket/HLS/DASH流媒体服务器 特性 跨平台 ...

  5. 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    1. 造成内存泄漏的原因? threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这 ...

  6. vue-awesome-swiper 第一张自动跳过

    昨天在上班中要做一个商品页面,需求是从后台接口获得轮播图的路径,然后传到封装好的组件中,本来以为很简单啊,没什么毛病,开始动手~ 东西很简单,新建一个banner组件 如下: <template ...

  7. Spring Boot配置ContextPath【从零开始学Spring Boot】

    Spring boot默认是/ ,这样直接通过http://ip:port/就可以访问到index页面,如果要修改为http://ip:port/path/ 访问的话,那么需要在Application ...

  8. js排序算法03——选择排序

    选排序的思路是首先从要排序的数组中选择最小的和目前的第一位交换位置,然后从剩下的数中选择最小的和第二个位置的数交换位置,再从剩下的数中选择最小的和第三个位置的数交换位置,以此类推,实现代码如下: fu ...

  9. 杀死dialog

    先 pkill -9 normal.sh 和  pkill -9 terminal_ui.sh 然后在pkill -9 dialog

  10. springboot跳转jsp页面

    springboot支持jsp页面跳转 官方不推荐jsp的支持(jar包不支持jsp,jsp需要运行在servletContext中,war包需要运行在server服务器中如tomcat)官方推荐使用 ...