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中,含有手机号码的参数,必须限定这个参数满足手机号码的格式

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

to_python

这个方法的返回值,将会传递到view函数中作为参数

现在有个需求:访问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

这个方法的返回值,将会在调用url_for函数的时候生成符合要求的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)

4、Flask实战第4天:自定义url转换器的更多相关文章

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

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

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

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

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

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

  4. django 自定义url转换器

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

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

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

  6. 2、Flask实战第2天:URL传参

    当我们访问网站/的时候,会执行hell_world函数,并把这个函数的返回值返回给浏览器,这样浏览器就显示hello world了 @app.route('/') def hello_world(): ...

  7. flask 自定义url转换器

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

  8. 自制URL转换器

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

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

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

随机推荐

  1. BZOJ_day4&&DSFZ_day1

    昨天坐火车才水了三道题... 25题 100810221041105110591087108811791191119212571303143218541876195119682140224224382 ...

  2. [spoj DISUBSTR]后缀数组统计不同子串个数

    题目链接:https://vjudge.net/contest/70655#problem/C 后缀数组的又一神奇应用.不同子串的个数,实际上就是所有后缀的不同前缀的个数. 考虑所有的后缀按照rank ...

  3. POJ1087:A Plug for UNIX(最大流)

    A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...

  4. codeforces 1060 A

    https://codeforces.com/contest/1060/problem/A 题意:电话号码是以8开头的11位数,给你n 个数问最多可以有多少个电话号码 题解:min(8的个数,n/11 ...

  5. 为什么VS没有提供平win64程序编写项

    最近在学习C++和MFC编程,突然有个疑问,为什么每次新建项目时,都只有win32 console application,从来没见过win64的选项,于是去网上查了查,下面是我找到的几个答案: 作者 ...

  6. PHP HERE DOCUMENT

    转自: http://www.codeweblog.com/php%E4%B8%ADheredoc%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/ Here ...

  7. 【转】cve2014-3153 漏洞之详细分析与利用

    背景学习: Linux Futex的设计与实现 使用者角度看bionic pthread_mutex和linux futex实现 By kernux TopSec α-lab 一 漏洞概述 这个漏洞是 ...

  8. Linux虚拟地址空间布局以及进程栈和线程栈总结【转】

    转自:http://www.cnblogs.com/xzzzh/p/6596982.html 原文链接:http://blog.csdn.net/freeelinux/article/details/ ...

  9. Smith-Waterman算法及其Java实现

    Smith-Waterman算法是1981年Smith和Waterman提出的一种用来寻找并比较具有局部相似性区域的动态规划算法,很多后来的算法都是在该算法的基础上发展的.这是一种两序列局部比对算法, ...

  10. POJ 1698 Alice's Chance

    题目:Alice 要拍电影,每一天只能参与一部电影的拍摄,每一部电影只能在 Wi 周之内的指定的日子拍摄,总共需要花 Di 天时间,求能否拍完所有电影. 典型的二分图多重匹配,这里用了最大流的 din ...