正则自定义转换器

为什么要自定义正则转换器?

因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了。

那么我们怎么自定义正则转换器呢?

from flask import Flask
from werkzeug.routing import BaseConverter app = Flask(__name__) class Config(object):
DEBUG = True app.config.from_object(Config) class RegexConverter(BaseConverter):
"""自动以的正则转换器"""
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
self.regex = args[0] app.url_map.converters['re'] = RegexConverter """
1.re()相当于RegexCoverter(),那么re("[0-9]{6}")相当于给RegexCoverter的__init__传递了参数“[0-9]{6}”
2.url_map是什么我们暂时不管,直接传递给BaseConverter的__init__
3.那么args[0]接收的就是我们定义的正则表达式
4.self.regex其实就是对BaseConverter中regex的重写
5.BaseConverter的这个原生regex:regex = '[^/]+'
"""
@app.route('/user/<re("[0-9]{6}"):user_id>')
def demo1(user_id):
return "用户的id是:%s"%user_id @app.route('/')
def hello_world():
return 'Hello World!!!' if __name__ == '__main__':
app.run()

转换器to_python

# 转换器to_python
from flask import Flask
from werkzeug.routing import BaseConverter
from flask import redirect # 创建Flask的应用程序
app = Flask(__name__) class ListConverter(BaseConverter):
regex = "(\\d+,?)+\\d$"
def to_python(self,value):
return value.split(",") app.url_map.converters['list'] = ListConverter @app.route('/test1/<list:user_ids>')
def demo1(user_ids):
return 'user_id是:%s' % user_ids if __name__ == '__main__':
# app 运行的参数 ip地址,端口,是否开启调试
app.run(debug=True) """
to_python转换器的程序运行:
1.浏览器向服务器发起访问:http://127.0.0.1:5000/test1/1,2,3
2.<list:user_ids>将'1,2,3'动态传到ListConverter对象内部进行regex正则匹配
3.匹配成功之后,再由to_python以','为分隔符,划分字符串,最后返回浏览器一个列表 """

附上一张分析图供大家学习:

转换器to_python

# 导入Flask
from flask import Flask
from werkzeug.routing import BaseConverter
from flask import redirect,url_for # 创建Flask的应用程序
app = Flask(__name__) class ListConverter(BaseConverter):
regex = "(\\d+,?)+\\d$" def to_python(self, value):
return value.split(",") # 返回一个列表 def to_url(self, value):
result = ",".join(str(v) for v in value)
return result # 返回一个字符串 app.url_map.converters['list'] = ListConverter @app.route('/test1/<list:user_ids>')
def demo1(user_ids):
return 'user_id是:%s' % user_ids @app.route('/demo2')
def demo2():
return redirect(url_for("demo1",user_ids=[1,2,3,4])) if __name__ == '__main__':
# app 运行的参数 ip地址,端口,是否开启调试
app.run(debug=True) """
to_url自定义转换器程序运行:
1.浏览器向服务器发起访问:http://127.0.0.1:5000/demo2
2.<list:user_ids>将[1,2,3,4]动态传到to_url函数先将[1,2,3,4]进行字符串化,然后进行regex正则匹配
3.匹配成功之后,重定向到http://127.0.0.1:5000/test1/1,2,3,4,并且将users_ids=[1,2,3,4]传给demo1(user_ids),所以
浏览器将输出user_ids的值是:[1,2,3,4]
"""

附上一张to_url分析图供大家理解学习:

看到这里也许大家很头疼,to_python和to_url到底是什么鬼,到底怎么记忆他们的用处和执行顺序。其实理解了也很简单:

可以这样的简化记忆

to_python:正则匹配,to_python函数处理,返回给视图函数

to_url:to_url函数处理,正则匹配,返回给重定向目标视图函数

那么可能你又要问了,为什么要这样搞,有什么用处?

呵呵,很简单,因为我们在项目中拿到的数据不一定都是我们正好需求的,当我们拿到一个列表,而我们又正好需要用这个列表中进行页面跳转,

那么这时候就可以用to_url来处理;to_python也是一样的道理,都是进行数据的处理,从而达到我们需求。

(还有不明白的可以下方留言,大家一起探讨↓↓↓↓↓↓)

Flask基础(07)-->正则自定义转换器的更多相关文章

  1. Flask自定义转换器,实现路由匹配正则表达式参数

    Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...

  2. flask自定义转换器

    根据具体的需求,有些时候是需要用到正则来灵活匹配URL,但是Flask的路由匹配机制是不能直接在路由里直接写正则的,这时候就需要使用转换器! Flask的默认转换器: DEFAULT_CONVERTE ...

  3. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  4. Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 & flask-session

    Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flas ...

  5. Flask基础(14)-->自定义过滤器

    Flask基础(13)-->自定义过滤器 什么是过滤器? 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 P ...

  6. 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  7. flask基础之一

    flask基础之一 hello world #从flask这个包中导入Flask这个类 #Flask这个类是项目的核心,以后的很多操作都是基于这个类的对象 #注册url,注册蓝图都是这个类的对象 fr ...

  8. Flask——基础知识

    Flask应用程序 一个简单的Flask应用程序 # 导入flask程序 from flask import Flask # 初始化flask对象 app = Flask(__name__) # 装饰 ...

  9. python框架之Flask基础篇(一)

    一.第一个hello world程序 # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') def ...

随机推荐

  1. 微信小程序室内地图导航开发-微信小程序JS加载esmap地图

    一.在微信小程序里显示室内三维地图 需要满足的两个条件 调用ESMap室内地图需要用到小程序web-view组件,想要通过 web-view 调用ESMap室内地图需要满足以下 2 个条件: 1. 小 ...

  2. Jedis操作Redis--String类型

    /** * String(字符串) * APPEND,BITCOUNT,BITOP,BITFIELD,DECR,DECRBY,GET,GETBIT,GETRANGE,GETSET,INCR,INCRB ...

  3. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  4. Git的合并

    merge: A---B---C topic / D---E---F---G master A---B---C topic / \ D---E---F---G---H master (在当前的bran ...

  5. CentOS 7 下的网络配置工具

    之前在CentOS 6下编辑网卡,直接使用setup工具就可以了. 但在新版的CentOS 7里,setuptool已经没有网络编辑组件了,取而代之的是NetworkManager Text User ...

  6. 搭建Nuget服务器(Nuget私服)

    一.前言 对公司或者对个人来说,经过一段时间的沉淀之后,都会有一些框架或者模块,为了对这些框架或者模块进行更好的管理和维护,也为了方便后面的开发或者其他同事,我们可以在我们本地或者内网搭建一个Nuge ...

  7. Redis集群的离线安装以及原理理解

    一.本文主要是记录一下Redis集群在linux系统下离线的安装步骤,毕竟在生产环境下一般都是无法联网的,Redis的集群的Ruby环境安装过程还是很麻烦的,涉及到很多的依赖的安装,所以写了一个文章来 ...

  8. 随笔之AJAX粗解 小白入门向

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 最大的 ...

  9. sql 单表distinct/多表group by查询去除重复记录

    单表distinct 多表group by group by 必须放在 order by 和 limit之前,不然会报错 下面先来看看例子: table   id name   1 a   2 b   ...

  10. Java 最常见 200+ 面试题答案全解析-面试必备

    本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Clou ...