Flask基础(07)-->正则自定义转换器
正则自定义转换器
为什么要自定义正则转换器?
因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了。
那么我们怎么自定义正则转换器呢?
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)-->正则自定义转换器的更多相关文章
- Flask自定义转换器,实现路由匹配正则表达式参数
Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...
- flask自定义转换器
根据具体的需求,有些时候是需要用到正则来灵活匹配URL,但是Flask的路由匹配机制是不能直接在路由里直接写正则的,这时候就需要使用转换器! Flask的默认转换器: DEFAULT_CONVERTE ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 & flask-session
Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flas ...
- Flask基础(14)-->自定义过滤器
Flask基础(13)-->自定义过滤器 什么是过滤器? 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 P ...
- 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- flask基础之一
flask基础之一 hello world #从flask这个包中导入Flask这个类 #Flask这个类是项目的核心,以后的很多操作都是基于这个类的对象 #注册url,注册蓝图都是这个类的对象 fr ...
- Flask——基础知识
Flask应用程序 一个简单的Flask应用程序 # 导入flask程序 from flask import Flask # 初始化flask对象 app = Flask(__name__) # 装饰 ...
- python框架之Flask基础篇(一)
一.第一个hello world程序 # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') def ...
随机推荐
- HDU4578 线段树(区间更新 + 多种操作)和平方,立方
参考:https://www.cnblogs.com/H-Vking/p/4297973.html 题意: 虽然是比较裸的线段树,但是比较麻烦,并且有很多细节需要考虑,对着别人的ac代码debug了一 ...
- CodeForces 628 D Magic Numbers 数位DP
Magic Numbers 题意: 题意比较难读:首先对于一个串来说, 如果他是d-串, 那么他的第偶数个字符都是是d,第奇数个字符都不是d. 然后求[L, R]里面的多少个数是d-串,且是m的倍数. ...
- Maximum Product UVA - 11059
Given a sequence of integers S = {S1, S2, . . . , Sn}, you should determine what is the value of the ...
- codeforces #583 problem D(搜索好题)
题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(1,1)无法到达(n,m),行进路线位向下或向右. 数据范围:n*m<=1e6 解题思路:答案一定是小于等于2的,因为可以直接阻碍(1 ...
- 什么是WSGI
WSGI全称为Python Web Server Gateway Interface,Python Web服务器网关接口,它是介于Web服务器和Web应用程序(或Web框架)之间的一种简单而通用的接口 ...
- 良许 | 听说,有个同事因为关闭服务器被打进 ICU ……
提问:你是如何关闭电脑的? 普通青年 文艺青年 二逼青年 你是属于哪一种呢? 实话说, 这三种良许都干过~ 还好我没有对服务器这么做, 否则-- 分分钟被打进 ICU -- 1. 关机命令知多少 对于 ...
- 用户上传gif动图分解成多张帧图片,并合并生成新gif图片
背景 为什么要制作这么一款工具 首先公司最近在做一款表情包的产品,需要将文字生成到gif图片中,并可以控制文字显示的位置,并将不同的文字显示在不同的图片上 制作成网页端工具,随时随地,方便使用 探索 ...
- CenTOS7使用ACL控制目录权限,只给某个用户访问特定目录
前言 Linux 基本的权限控制仅可以对所属用户.所属组.其他用户进行的权限控制,而不能精确地控制每个用户的权限.ACL 规则就是用来解决这个问题的. 使用 ACL 规则,我们可以针对单一账户设置文件 ...
- [大数据学习研究]2.利用VirtualBox模拟Linux集群
1. 在主机Macbook上设置HOST 前文书已经把虚拟机的静态IP地址设置好,以后可以通过ip地址登录了.不过为了方便,还是设置一下,首先在Mac下修改hosts文件,这样在ssh时就不用输入ip ...
- MongoDB入门及 c# .netcore客户端MongoDB.Driver使用
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...