flask路由规则及正则转换器converter
(1)查看所有路由
我们可以通过app.url_map来查看当前项目下的所有 路由信息列表。
# coding:utf-8 from flask import Flask # 创建flask应用
app = Flask(__name__) @app.route('/')
def index(): return 'hello Flask' if __name__ == '__main__': # 通过url_map可以查看整个flask中的路由信息 print(app.url_map) # 启动flask程序 app.run()
信息说明:
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
我们可以看到目前有两个路由
第一个:是 /
,即我们定义的跟路由,后面是他支持的请求方式(HEAD, OPTIONS, GET)
对应视图函数为index
。
第二个:是/static/filename
,这是系统自定义的静态文件访问路由,支持的请求方式有(HEAD, OPTIONS, GET)
,对应static
文件夹
(2)自定义请求方式POST
@app.route('/post', methods=['POST'])
# coding:utf-8 from flask import Flask # 创建flask应用
app = Flask(__name__, static_url_path='/python') @app.route('/')
def index(): return 'hello Flask' @app.route('/post', methods=['POST'])
def post_request():return 'post method'if __name__ == '__main__': # 通过url_map可以查看整个flask中的路由信息 print(app.url_map) # 启动flask程序 app.run()
可以看到我们增加了一个POST
请求后,在路由列表中打印了出来,请求路由为/post
,请求方式(POST, OPTIONS)对应视图函数为post_request
,同时我们修改了静态文件访问前缀为python
,在路由列表中也体现了出来,但其实际文件存放路径依然为ststic
目录。
(3)验证我们定义的请求方式是生效
我们发现,当我们在浏览器中访问:127.0.0.1:5000/post
,回车后提示我们请求方式不允许,因为直接通过浏览器请求,请求方式为GET
,所以会被拒绝。当我们通过终端使用curl -X POST -i
命令以POST
请求方式访问该路由时,返回了post method
信息,说明我们定义的POST请求方式没有问题。
(4)同一路由装饰多个视图函数
@app.route('/hello', methods=['GET'])
def hello():return 'hello 1'@app.route('/hello', methods=['POST'])
def hello2():return 'hello 2'
说明:如果两个视图请求路径一致,且请求方式也一致,那么上面的视图将会把下面的视图覆盖。
(5)同一视图多个路由装饰器
@app.route('/hi')
@app.route('/hi2')
def hi():return 'hi flask'
(6)反向解析
使用redirect
函数,找到要跳转视图的url
路由,进行跳转。
from flask import Flask, redirect # 创建flask应用
app = Flask(__name__) @app.route('/')
def index(): return 'hello Flask' @app.route('/login')
def login():url = '/'return redirect(url)
使用url_for
,找到要跳转视图的视图函数
,进行跳转(推荐使用
)。
from flask import Flask, url_for # 创建flask应用
app = Flask(__name__) @app.route('/')
def index(): return 'hello Flask' @app.route('/login')
def login():url = url_for('index')return redirect(url)
(7)提取路由参数
@app.route('/goods/<int:id>')
def goods_detail(id):return 'goods id is %d' % id
转化器 | |
---|---|
int | 接收整形 |
float | 同int,但是可以接受浮点型 |
path | 和默认的相似,但也接受斜线 |
@app.route('/goods/<id>')
def goods_detail(id):return 'goods id is %d' % id
不加转换器,默认是普通字符串规则(除了/
的字符)
(8)定义自己的转换器
(1)定义装换器
from werkzeug.routing import BaseConverterclass MobelConverter(BaseConverter):""""""def __init__(self, url_map):# 调用父类的初始化方法(python2中super()必须写参数)super(RegexConverter, self).__init__(url_map)# 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配self.regex = r'1[34578]\d{9}'
(2)将自定义转换器添加到flask
应用中
app.url_map.converters['mobile'] = MobelConverter
(3)在url
中使用
@app.route('/send/<mobile:mobile>')
def send_msg(mobile):return 'send msg to %s' % mobile
(9)实现自己的万能转换器
(1)定义装换器
from werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter):""""""def __init__(self, url_map, regex):# 调用父类的初始化方法(python2中super()必须写参数)super(RegexConverter, self).__init__(url_map)# 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配self.regex = regex
(2)将自定义转换器添加到flask
应用中
app.url_map.converters['re'] = RegexConverter
(3)在url
中使用
@app.route("/send/<re(r'1[34578]\d{9}'):mobile>")
def send_msg(mobile):return 'send msg to %s' % mobile
(10)BaseConverter
对象解析
from werkzeug.routing import BaseConverter
from flask import Flask # 创建flask应用
app = Flask(__name__) class RegexConverter(BaseConverter):""""""def __init__(self, url_map, regex):# 调用父类的初始化方法(python2中super()必须写参数)super(RegexConverter, self).__init__(url_map)# 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配self.regex = regexdef to_python(self, value):print('to_python方法被调用 ')return valuedef to_url(self, value):passapp.url_map.converters['re'] = RegexConverter# 127.0.0.1:5000/send/18612345678
@app.route("/send/<re(r'1[34578]\d{9}'):mobile>")
def send_msg(mobile):return 'send msg to %s' % mobileif __name__ == '__main__': # 启动flask程序 app.run()
to_python
函数说明:
当我们访问路径127.0.0.1:5000/send/18612345678
时,re(r'1[34578]\d{9}')
匹配到的参数会先传递给函数to_python
中的value
参数,那么我们可以在to_python
函数中对拿到的数据进行进一步处理,例如:类型转换,过滤等操作。
from werkzeug.routing import BaseConverter
from flask import Flask # 创建flask应用
app = Flask(__name__) class RegexConverter(BaseConverter):"""自定义转换器"""def __init__(self, url_map, regex):# 调用父类的初始化方法(python2中super()必须写参数)super(RegexConverter, self).__init__(url_map)# 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配self.regex = regexdef to_python(self, value):"""使用自定义转换器时会被调用"""value = 'abcdefg'return valuedef to_url(self, value):passapp.url_map.converters['re'] = RegexConverter# 127.0.0.1:5000/send/18612345678
@app.route("/send/<re(r'1[34578]\d{9}'):mobile>")
def send_msg(mobile):return 'send msg to %s' % mobileif __name__ == '__main__': # 启动flask程序 app.run()
to_value
函数说明:
该函数主要用于url_for
反向解析
from werkzeug.routing import BaseConverter
from flask import Flask, redirect, url_for # 创建flask应用
app = Flask(__name__) class RegexConverter(BaseConverter):def __init__(self, url_map, regex):# 调用父类的初始化方法(python2中super()必须写参数)super(RegexConverter, self).__init__(url_map)# 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配self.regex = regexdef to_python(self, value):"""使用自定义转换器时会被调用"""return valuedef to_url(self, value):"""使用url_for时会被调用"""return valueapp.url_map.converters['re'] = RegexConverter# 127.0.0.1:5000/send/18612345678
@app.route("/send/<re(r'1[34578]\d{9}'):mobile>")
def send_msg(mobile):return 'send msg to %s' % mobile@app.route('/login')
def login():# /send/13673483485url = url_for('send_msg', mobile='13673483485')return redirect(url)if __name__ == '__main__': # 启动flask程序 app.run()
说明: 当用户访问127.0.0.1::5000/login
时,会重定向到send_msg
视图对应的url
,而该路由需要接参数(手机号码
),那么我们在进行反向解析时就需要传递该参数,而我们传递的参数首先会被传递给to_url
函数中的value
参数。
from werkzeug.routing import BaseConverter
from flask import Flask, redirect, url_for # 创建flask应用
app = Flask(__name__) class RegexConverter(BaseConverter):def __init__(self, url_map, regex):# 调用父类的初始化方法(python2中super()必须写参数)super(RegexConverter, self).__init__(url_map)# 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配self.regex = regexdef to_python(self, value):"""使用自定义转换器时会被调用"""return valuedef to_url(self, value):"""使用url_for时会被调用"""print('url_for方法被调用')return '15811111111'app.url_map.converters['re'] = RegexConverter# 127.0.0.1:5000/send/18612345678
@app.route("/send/<re(r'1[34578]\d{9}'):mobile>")
def send_msg(mobile):return 'send msg to %s' % mobile@app.route('/login')
def login():# /send/13673483485url = url_for('send_msg', mobile='13673483485')return redirect(url)if __name__ == '__main__': # 启动flask程序 app.run()
flask路由规则及正则转换器converter相关推荐
- Flask路由分发及转换器
引言 本文重点介绍,Flask路由分发及访问静态资源. 路由分发 app.route 装饰器的作用是将路由映射到视图函数,从浏览器输入对应的 url 地址,Flask程序,就会根据 url 找到对应的 ...
- python3 flask 路由
原文链接: python3 flask 路由 上一篇: Python3 requests 添加 cookie 下一篇: python 运行 linux 命令 from flask import Fla ...
- flask -- 路由与视图函数
原文链接 1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的 ...
- 深入理解Flask路由(2)- werkzeug 路由系统
本系列共三篇文章: 深入理解Flask路由的实现机制 深入理解Flask路由(2)- werkzeug 路由系统 深入理解Flask路由 (3) - 动态 url 及转换器 上一篇我们说到:Flask ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- kohana中的路由规则
Kohana的路由规则是非常强大的.首先必须确认的是路由的匹配原则是有顺序,当一条路由规则匹配成功时,就停止匹配,也就是说在其后面定义的路由规则将不再被执行,因此最后的一条路由规则几乎可以匹配所有的路 ...
- MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则
MVC路由:由于路由global中注册了,在程序第一次运行时,在MVC会自动生成路由,类似于字典的格式缓存下来,但路由生成的规则又是怎样的呢? 路由生成规则是: 1>更具你定义的的顺序查找路由规 ...
- react-router v4 路由规则解析
前言 react-router升级到4之后,跟前面版本比有了很大的差别. 例如包的拆分,动态路由等详细的差别就不说了,各位大神的总结也很到位,详细可以点击看看,All About React Rout ...
- php yii路由规则,Yii2 路由基本配置
Yii2 支持以下几种路由格式: ```php /index.php?r=post%2Fview&id=100 /index.php/post/100 /posts/100 ``` 其中第一个 ...
最新文章
- 开发日记-20190615 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
- Android给自定义按键添加广播和通过广播给当前焦点输入框赋值
- java 输入输出头文件_引入的标准头文件与标准输出以及FOR循环
- 央视《新闻联播》正式入驻快手平台
- Linux内核升级Broadcom网卡问题(bnx2)
- day 029 缓冲区和粘包 day 30 粘包的解决
- System center virtual machine manager 2008 R2安装部署
- ComBox 绑定数据库
- Android WiFi 获取 IP 过程
- 全网首发:麒麟平台更新时提示错误:无法解析域名“archive.kylinos.cn”
- SpringMVC+Vue实现前后端分离的宠物管理系统
- mysql 序列号_mysql 序列号生成器(转)
- 电子罗盘的工作原理及校准
- 如何用R语言做深度学习
- android 对话框Dialog拦截activity事件通知
- php表单时间控件,phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法...
- namecheap域名设置Cloudflare为第三方DNS
- 第六章总结-莫凡商城的注册、登录功能
- html如何让图片边缘模糊化,如何使用css滤镜获得图像:模糊和锐利的边缘?
- 舌苔发白是什么原因造成的?
热门文章
- git stash 压栈
- 【软件工程】第五章 结构化设计
- SAP UI5 智能控件 Smart Controls 的初步认识试读版
- deepin linux版本回退,解决Deepin 20下升级360浏览器86内核版就退回78内核版本的问题...
- VSCODE+PLANTUML
- Unity3D 场景切换异步加载进度
- Javascript 日志工具blackbird
- 性能服务器图片介绍大全,IDF2012:英特尔22nm处理器图形性能介绍
- requests 爬取博客园内容AttributeError: ‘NoneType‘ object has no attribute ‘xpath‘
- Dreammail 常见问题