zoukankan      html  css  js  c++  java
  • flask第十一篇——自定义url转换器

    首先和大家说一下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

    这里有点不好理解,很难理解,大家看懂更好,看不懂就知道有这么回事就好,后面还会有这里的说明的。

    请关注微信公众号:自动化测试实战 ,查看清晰排版及图片

  • 相关阅读:
    第2讲——处理数据
    第1讲——用C++写一个程序
    数论18——反演定理(莫比乌斯反演)
    数论17——反演定理(二项式反演)
    数论16——母函数
    数论15——抽屉原理
    数论14——容斥原理
    数论13——康托展开
    com.opensymphony.xwork2.config.ConfigurationManager.addConfigurationProvider
    Tomcat的杂七杂八
  • 原文地址:https://www.cnblogs.com/captainmeng/p/8572838.html
Copyright © 2011-2022 走看看