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

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

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

首先导入BaseConverter

from werkzeug.routing import BaseConverter

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

UnicodeConverter
AnyConverter
PathConverter
NumberConverter
IntegerConverter
FloatConverter
UUIDConverter

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

#: the default converter mapping for the map.
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}

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

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

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

#coding=utf-8
from flask import Flask
from werkzeug.routing import BaseConverter
app=Flask(__name__)
class TelephoneConverter(BaseConverter):
regex = r"1[3458]\d{9}" #这里是定义数据类型的名字,并注册到url_map中
app.url_map.converters['tel']=TelephoneConverter #然后我们就可以使用自定一的tel类型了
@app.route('/my_tel/<tel:telephone>')
def my_tel(telephone):
return "您的手机号码是:{}".format(telephone) if __name__ =='__main__':
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

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

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

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

to_url

复制代码
class ListConveter(BaseConverter):
def to_python(self, value):
return value.split("+") def to_url(self, value):
return '+'.join(value) app.url_map.converters['list'] = ListConveter @app.route('/')
def hello_world():
return url_for('posts', boards=['a', 'b']) @app.route('/posts/<list:boards>')
def posts(boards):
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. API 测试的具体实现

    目录 API 测试的具体实现 基于 Spring Boot 构建的 API 使用 cURL 命令行工具进行测试 使用图形界面工具 Postman 进行测试 如何应对复杂场景的 API 测试? 总结 A ...

  2. MySQL - 扩展性 3 负载均衡:眼花缭乱迷人眼

    负载均衡的基本思路很简单: 在一个服务器集群中尽可能地的平均负载量. 基于这个思路,我们通常的做法是在服务器前端设置一个负载均衡器.负载均衡器的作用是将请求的连接路由到最空闲的可用服务器上.如图 1, ...

  3. Hibernate内容详解

    一:引入Hibernate的jar包 http://t.cn/EioD1xk 二:配置Hibernate的核心配置文件hibernate.cfg.xml <!DOCTYPE hibernate- ...

  4. python3的变量作用域规则和nonlocal关键字

    也许你已经觉得自己可以熟练使用python并能胜任许多开发任务,所以这篇文章是在浪费你的时间.不过别着急,我们先从一个例子开始: i = 0 def f(): print(i) i += 1 prin ...

  5. 自定义超链接动画---transition

    效果图: <a href="#"> <span>HTML</span> </a> a { position: relative; t ...

  6. 关于css兼容性问题及一些常见问题汇总

    目前主流浏览器的兼容性做的都比较好了,本文主要针对IE6,7的不兼容问题进行解决. 1.圆盘时钟有浮动存在时,计算一定要精确,不要让内容的宽高超出我们所设置的宽高,IE6下,内容会撑开设置好的高度. ...

  7. Error:"Java patch PatchPasswordEncryption_J10001 is being applied by some other process" when starting Ranger Admin

    SupportKB Problem Description: When starting Ranger admin, it fails to start up with the following e ...

  8. gulp+tp5配置

    优化了文件过滤,更改文件只会重新生成修改的文件 项目目录构建: 在入口文件public下,创建html目录,作为前台静态资源目录 gulp.js文件 /*! * gulp * $ npm instal ...

  9. python 基础语法梳理(二)

    1.gevent使用 # -*- coding: utf-8 -*- import gevent import platform from gevent import subprocess def _ ...

  10. nginx部署静态网站

    实验环境 服务器:centos7.5 1核1G Nginx版本:nginx-1.14.2 主题 部署静态文件 根据不同url请求路径,定向到不同的系统文件夹 部署静态文件 假设nginx安装在“/us ...