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. MIP 移动网页加速器视频教程全新发布

    MIP (Mobile Instant Pages - 移动网页加速器) 是百度推出的开源项目,用于移动端页面加速.MIP 技术通过优化浏览器资源加载,前端代码执行及 CDN 缓存加速来加速页面,打造 ...

  2. 安卓开发笔记(三十):自定义Button

    在笔者本人看了很多博客和书之后,发现很少博主对于自定义控件能够进行一个比较全面的思路讲解,大多数都是只讲了一些细节,但并没有讲如何把代码进行整体的实现.因此这里讲讲整体的自定义button实现的详细过 ...

  3. Java 运算符 % 和 /

    / 是除运算符, %是取模运算符 区别: / 是普通的除法运算,如果除数和被除数都是整数,则商是取整 %是求余数 private static void test() { System. / ); S ...

  4. Vue 进阶之路(五)

    之前的文章我们说了一下 vue 的样式绑定,这篇文章来介绍一下 vue 中的条件渲染,先看下面的代码: <!DOCTYPE html> <html lang="en&quo ...

  5. Asp.Net Core 轻松学-多线程之Task(补充)

    前言     在上一章 Asp.Net Core 轻松学-多线程之Task快速上手 文章中,介绍了使用Task的各种常用场景,但是感觉有部分内容还没有完善,在这里补充一下. 1. 任务的等待 在使用 ...

  6. [ArcGIS API for JavaScript 4.8] Sample Code-Get Started-MapView,SceneView简介

    [官方文档:https://developers.arcgis.com/javascript/latest/sample-code/index.html]  一.Intro to MapView(2D ...

  7. php7连接mysql测试代码

    php7连接mysql测试代码 <?php $mysqli = new mysqli("localhost", "root", "passwor ...

  8. AI应用开发实战 - 手写算式计算器

    扩展手写数字识别应用 识别并计算简单手写数学表达式 主要知识点 了解MNIST数据集 了解如何扩展数据集 实现手写算式计算器 简介 本文将介绍一例支持识别手写数学表达式并对其进行计算的人工智能应用的开 ...

  9. Linux 开启和关闭 Ping 操作

    Linux 默认是开启 ping 操作的,通过以下两种方式可以开启和关闭 ping 操作 . 1.修改内核参数 通过内核参数设置也有两种方式,一种是临时修改,一种是永久修改. 1.1 临时设置 PIN ...

  10. C#在window服务配置Log4Net.dll

    1.使用背景: C#window服务下添加一个日志记录程序集(Log4Net.dll) 2.添加和使用步骤如下: 一.下载并引入Log4Net.dll程序集到项目中 下载地址:http://loggi ...