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 ...
随机推荐
- Mac OS 下包管理器 homebrew的安装
homebrew :熟悉mac os的小伙伴们一定都知道这个包管理工具,它非常方便且好用,安装它只需要打开终端并将以下代码粘贴到终端中运行即可: /usr/bin/ruby -e "$(cu ...
- Chrome 开发工具之 Application
Chrome 开发者工具有 Application 这么一个面板,主要作用是检查 web 应用加载的所有资源,包括 Manifest.Service Workers.Local Storage.Ses ...
- HashMap原理。图文并茂式解读。这些注意点你一定还不了解
目录 概述 属性详解 table entrySet size modCount threshold.loadFactor 源码知识点必备 getGenericInterfaces和getInterfa ...
- SDU暑期集训排位(5)
SDU暑期集训排位(5) A. You're in the Army Now 题意 类似选志愿.每个人有 mark,有优先级从高到低的志愿. 做法 定睛一看,鲨鼻题.然后 WA. 为什么会 WA 呢? ...
- hdu 5902 GCD is Funny
Problem Description Alex has invented a new game for fun. There are n integers at a board and he per ...
- Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...
- selenium爬虫
Web自动化测试工具,可运行在浏览器,根据指令操作浏览器,只是工具,必须与第三方浏览器结合使用,相比于之前学的爬虫只是慢了一点而已.而且这种方法爬取的东西不用在意时候ajax动态加载等反爬机制.因此找 ...
- 环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的JVM信息
关于环境: 本文中的实战都是在docker容器中进行的,容器的出处请参照<在docker上编译openjdk8>一文,里面详细的说明了如何构造镜像和启动容器. 在上一篇文章<修改,编 ...
- Fire Balls 08——音效的添加
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Go操作MySQL
MySQL是常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的 ...