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 ...
随机推荐
- ResourceManager基本职能和内部架构
YARN也采用了Master/Slave结构,其中,Master实现为ResourceManager,负责整个集群资源的管理与调度:Slave实现为NodeManager,负责单个节点的资源管理与任务 ...
- Java 复制PPT幻灯片
本篇文章将介绍通过java程序原样复制PPT幻灯片的方法.这里分两种情况来复制,即 在同一幻灯片文档中复制 在不同幻灯片文档间复制 使用工具:Free Spire.Presentation for J ...
- 学生管理系统 Python语言
def show_student(): print(('*'*20).center(55)) print('1.添加学生信息'.center(50)) print('2.修改学生信息'.center( ...
- tensorflow学习笔记——自编码器及多层感知器
1,自编码器简介 传统机器学习任务很大程度上依赖于好的特征工程,比如对数值型,日期时间型,种类型等特征的提取.特征工程往往是非常耗时耗力的,在图像,语音和视频中提取到有效的特征就更难了,工程师必须在这 ...
- IT项目管理入门知识
- codeforces 816 C. Karen and Game(模拟+思维)
题目链接:http://codeforces.com/contest/816/problem/C 题意:给出一个矩阵,问能否从都是0的情况下只将一整行+1或者一整列+1变形过来,如果可以输出需要步数最 ...
- hdu 1503 Advanced Fruits 最长公共子序列 *
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- CH4301 Can you answer on these queries III 题解
给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一: "2 x y",把 A[x] 改成 y. "1 x y&quo ...
- java解决回文数
递归解决palindrome问题 如果String仅仅只是一个或者0个字符,则它就是palindrome 否则比较字符串第一个和最后一个字符 如果第一个和最后一个字符不同,那么就不是palindrom ...
- ConcurrentHashMap 的工作原理及代码实现
ConcurrentHashMap采用了非常精妙的"分段锁"策略,ConcurrentHashMap的主干是个Segment数组.Segment继承了ReentrantLock,所 ...