url传参可以限定参数的数据类型,例如:限定user_id数据类型为int

  1. @app.route('/user/<int:user_id>')
  2. def my_list(user_id):
  3. return '您输入的user_id为:{}'.format(user_id)

当我们传递的参数不是int类型的时候,页面访问该url就会返回404错误,我们可以来看下flask是如何定义这些数据类型的

首先导入BaseConverter

  1. from werkzeug.routing import BaseConverter

按住ctrl用户鼠标点击BaseConverter进去查看源码,可以发现BaseConverter是一个基类,下面很多子类继承了它,这些子类是

  1. UnicodeConverter
  2. AnyConverter
  3. PathConverter
  4. NumberConverter
  5. IntegerConverter
  6. FloatConverter
  7. UUIDConverter

往下看,可以看出这些都是默认的数据类型

  1. #: the default converter mapping for the map.
  2. DEFAULT_CONVERTERS = {
  3. 'default': UnicodeConverter,
  4. 'string': UnicodeConverter,
  5. 'any': AnyConverter,
  6. 'path': PathConverter,
  7. 'int': IntegerConverter,
  8. 'float': FloatConverter,
  9. 'uuid': UUIDConverter,
  10. }

通过源码,我们知道这些就是flask给我们定义的数据类型,这些子类都是继承BaseConverter,然后利用正则来匹配

了解这些后,我们就可以自定义数据类型了

需求:一个url中,含有手机号码的参数,必须限定这个参数满足手机号码的格式

  1. #coding=utf-8
  2. from flask import Flask
  3. from werkzeug.routing import BaseConverter
  4. app=Flask(__name__)
  5. class TelephoneConverter(BaseConverter):
  6. regex = r"1[3458]\d{9}"
  7.  
  8. #这里是定义数据类型的名字,并注册到url_map中
  9. app.url_map.converters['tel']=TelephoneConverter
  10.  
  11. #然后我们就可以使用自定一的tel类型了
  12. @app.route('/my_tel/<tel:telephone>')
  13. def my_tel(telephone):
  14. return "您的手机号码是:{}".format(telephone)
  15.  
  16. if __name__ =='__main__':
  17. app.run(host='127.0.0.1',port=8080) # 运行,指定监听地址为127.0.0.1:8080

to_python

这个方法的返回值,将会在调用url_for函数的时候生成符合要求的url形式

现在有个需求:访问127.0.0.1/posts/a+b能够显示出a和b的所有帖子

根据需求,我们知道需要把参数a+b解析出来,并通过数据库去查询,这里不去讨论数据库这块,只是来怎么分解a+b

  1. @app.route('/posts/<boards>')
  2. def posts(boards):
  3. borads = boards.split('+') #borads现在是一个列表,很容易取出a,b的值
  4. return str(borads)

上面的方法虽然可以实现,但是如果用到的类似场景较多的时候,我们还要再写一遍,每次写就比较麻烦,这时候我们就可以利用to_python来实现

  1. class ListConveter(BaseConverter):
  2. def to_python(self, value): #这个value就是我们url的参数
  3. return value.split("+") #这个返回值,就是我们视图函数接收到的参数
  4.  
  5. app.url_map.converters['list'] = ListConveter
  6.  
  7. @app.route('/posts/<list:boards>')
  8. def posts(boards): #这里的borads已经被list处理了,变成了列表
  9. return str(borads)

to_url

  1. 复制代码
  2. class ListConveter(BaseConverter):
  3. def to_python(self, value):
  4. return value.split("+")
  5.  
  6. def to_url(self, value):
  7. return '+'.join(value)
  8.  
  9. app.url_map.converters['list'] = ListConveter
  10.  
  11. @app.route('/')
  12. def hello_world():
  13. return url_for('posts', boards=['a', 'b'])
  14.  
  15. @app.route('/posts/<list:boards>')
  16. def posts(boards):
  17. return str(boards)

up  up !

2019-01-16 18:17:17

python3 Flask -day4 自定义url转换器的更多相关文章

  1. flask第十一篇——自定义url转换器

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

  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转换器【2】

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

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

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

  6. flask 自定义url转换器

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

  7. 自制URL转换器

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

  8. 1.flask视图和URL

    1.第一个flask程序 from flask import Flask ''' Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 注册URL等等,都是基于这个类 ''' app = F ...

  9. 六:flask-自定义URL转换器

    flask进行url参数匹配的时候,是继承的werkzeug.routing.BaseConverter库进行重写的 导入看源码 里面有所有的URL参数数据类型的判断 也就是说,可以继承过后实现自己的 ...

随机推荐

  1. 手写事件代理函数 (Delegated function)

    ‘手写 ’ 这个词 ,面试是不是听过无数遍呢 ! 今天我们来手写一个这样的事件委托函数 => function( parent, selector, type ,  handle)  {} 你需 ...

  2. HighChar 案例

    Highchars //前台 <script> $(function () { //showChat(); initChat(); showPie(); initPie(); }) fun ...

  3. 第1章 发现端点(Discovery Endpoint) - IdentityModel 中文文档(v1.0.0)

    OpenID Connect发现端点的客户端库作为httpclient的扩展方法提供.该GetDiscoveryDocumentAsync方法返回一个DiscoveryResponse对象,该对象具有 ...

  4. Cenots7下安装运行.NET Core、MicroSoft SQL Server 2019 preview 的基础实践

    一:概要 适应人群:.Net初学者.想了解.Net Core在Linux系统中的运行环境搭建者.初次且想在linux上应用.Net Core开发应用程序者: 基础技能:了解.NET基础开发技能者.有一 ...

  5. HTML 练习清除浮动 :after

    为 clearfix 类所在的 div 内部最后处添加一个 div 标签,内容为 . ,高度为0, 隐藏 <!DOCTYPE html> <html lang="en&qu ...

  6. GIS之家小专栏

    专栏简介:WebGIS开发者@GIS之家,一直混迹GIS行业,关注WebGIS开发方向,在本专栏中,分享WebGIS入门开发系列技术文章 核心内容: arcgis api 3.x for js开发系列 ...

  7. 关于IT公司技术委员会职责

    技术委员会的核心职责 组织人才相关 • 制定职级标准 - 能力框架:知识,技能,通用素质 - 职级标准:T2T3T4-P7P8P9- • 职级评审,对齐标准 • 高端招聘,对齐标准 • 校园招聘,对齐 ...

  8. 远程连接身份验证错误,又找不到加密Oracle修正

    远程连接服务器出现了错误,错误信息为:远程连接身份验证错误,又找不到加密Oracle修正. 服务器系统:Windows Server2016 客户端系统:Windows10家庭版和专业版   出错原因 ...

  9. Android开发:文本控件详解——TextView(一)基本属性

    一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...

  10. body标签中l的相关标签

    字体标签: h1~h6.font. u.b,.strong. em. sup. sub 排版标签: div,.span.br.hr.center.pre 图片标签: img 超链接: a 列表标签: ...