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

继续昨天的话题,今天我们来写一个手机号的转换器,方便大家理解

我们在`BaseConverter`源码里看到好多这种正则表达式:

正则表达式的目的就是规范匹配的规则,现在我们写一个简单的匹配手机号的正则,但是手机号不管是在`to_python`里还是在`to_url`里都是一个字符串,所以这次我们就不需要重写这两个方法了:

# 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('+')
        return tmp
    
    def to_url(self, values):
        """
        将[1,2,3]转换成1+2+3
        """
        # 遍历列表values中的数据,以+连接,最后tmp1的值即1+2+3
        tmp1 = '+'.join([BaseConverter.to_url(self, value) for value in values])
        return tmp1


class PhoneConverter(BaseConverter):

    regex = r'1\d{10}'


# 将写好的类注册到DEFAULT_CONVERTERS
app.url_map.converters['list'] = ListConverter
app.url_map.converters['phone'] = PhoneConverter


@app.route('/detail/<list:params>/')
def detail(params):
    print 'params:%s' % params    
    return 'success for url'


@app.route('/phone/<phone:telephone>/')
def phoneNumber(telephone):
    print telephone    
    return telephone


if __name__ == '__main__':
    app.run()

执行代码后看到:

昨天的代码我同样保留了,希望大家可以做一下对比。

为避免大家认识不到,说一下代码里需要注意的地方

  • app.url_map.converters['phone'] = PhoneConverter

这里的phone要和@app.route('/phone/<phone:telephone>/')里面的传参类型一致。就是说这两个红色的字符串是要相同的。

  • 正则表达式

船长一直想学正则,无奈找不到好的教程,船长有时间会继续找找,如果找到了且学会了,会及时和大家分享的。

身体不舒服,今天就说这么多了,希望大家有时间好好看看,我是觉得虽然是测试,但是要想成为真正的大神不会点Python开发是不行的。大家和我一起加油吧。

还要说一件事,就是后台回复以后可能我不能及时看到,如果真的着急,我指的是工作上需要帮忙,那就加我微信:729897971,船长会的不多,但会知无不言。如果不着急就不要加了,最近加好友的朋友一直在问问题,有时候半夜一点还要问问题,不帮忙解决不是我的性格,帮忙到后半夜第二天精神真的不佳……真的回复不过来,忘谅解。我写公众号无非是想帮助不会的朋友,希望大家以后有人问你问题的时候,如果你会,就好好告诉他答案;如果让我看到你告诉他“去百度”……我会喷你的,真的

原文发布于微信公众号 - 自动化测试实战(gh_839e78b6ba28)

原文发表时间:2018-03-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师学习

2017年终巨献阿里、腾讯最新Java程序员面试题,准备好进BAT了吗

Java基础 进程和线程的区别; Java的并发、多线程、线程模型; 什么是线程池,如何使用? 数据一致性如何保证;Synchronized关键字,类锁,方法锁...

38150
来自专栏精讲JAVA

Gof设计模式之静态工厂模式(五)

设计模式之静态工厂模式 01前言 该系列模式已经更新五篇,希望大家可以多看看以前的模式,并且从今天开始我打算换一种讲解方式,我不在贴出运行结果...

21060
来自专栏HansBug's Lab

算法模板——Dinic网络最大流 1

实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是...

31480
来自专栏Java架构

每个 JavaScript 工程师都应当知道的 10 个面试题以人为本1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么?2. 什么是函数式编程?3. 类继承和原型继承有什么区别?

30560
来自专栏前端黑板报

Vue列表循环从指定下标开始

最近遇到一个问题,在循环商品列表时,因为数组的第一个是商品的品牌介绍,所以循环时不能直接循环,只能从第二个元素开始。

1.7K30
来自专栏思考的代码世界

Python网络数据采集之数据清洗|第06天

14830
来自专栏撸码那些事

【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

一种重要的抽象实现手法是创建内聚而完整的抽象。抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。如果抽象只支持部分相关的方法,其使用者就可能不得不自己去实...

17690
来自专栏微服务生态

由学习《软件设计重构》所想到的代码review(一)

对于一个程序员来讲如何来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我经常接触的一些程序员来看,他们买了很多技术重构类书籍,但...

6930
来自专栏数据结构与算法

BZOJ1026: [SCOI2009]windy数(数位dp)

12120
来自专栏圣杰的专栏

DDD理论学习系列(11)-- 工厂

1.引言 在针对大型的复杂领域进行建模时,聚合、实体和值对象之间的依赖关系可能会变得十分复杂。在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实...

276100

扫码关注云+社区

领取腾讯云代金券