(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相关推荐

  1. Flask路由分发及转换器

    引言 本文重点介绍,Flask路由分发及访问静态资源. 路由分发 app.route 装饰器的作用是将路由映射到视图函数,从浏览器输入对应的 url 地址,Flask程序,就会根据 url 找到对应的 ...

  2. python3 flask 路由

    原文链接: python3 flask 路由 上一篇: Python3 requests 添加 cookie 下一篇: python 运行 linux 命令 from flask import Fla ...

  3. flask -- 路由与视图函数

    原文链接 1. 概述 路由 是MVC架构的Web框架中相当重要的一个概念,也是本节课程的重点.顾名思意,路由就是在迷茫中找出一条路的意思.在Flask框架中,路由 就表示为用户请求的URL找出其对应的 ...

  4. 深入理解Flask路由(2)- werkzeug 路由系统

    本系列共三篇文章: 深入理解Flask路由的实现机制 深入理解Flask路由(2)- werkzeug 路由系统 深入理解Flask路由 (3) - 动态 url 及转换器 上一篇我们说到:Flask ...

  5. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  6. kohana中的路由规则

    Kohana的路由规则是非常强大的.首先必须确认的是路由的匹配原则是有顺序,当一条路由规则匹配成功时,就停止匹配,也就是说在其后面定义的路由规则将不再被执行,因此最后的一条路由规则几乎可以匹配所有的路 ...

  7. MVC路由学习:自定义路由参数(用户看不到参数名),重新定义路由规则

    MVC路由:由于路由global中注册了,在程序第一次运行时,在MVC会自动生成路由,类似于字典的格式缓存下来,但路由生成的规则又是怎样的呢? 路由生成规则是: 1>更具你定义的的顺序查找路由规 ...

  8. react-router v4 路由规则解析

    前言 react-router升级到4之后,跟前面版本比有了很大的差别. 例如包的拆分,动态路由等详细的差别就不说了,各位大神的总结也很到位,详细可以点击看看,All About React Rout ...

  9. php yii路由规则,Yii2 路由基本配置

    Yii2 支持以下几种路由格式: ```php /index.php?r=post%2Fview&id=100 /index.php/post/100 /posts/100 ``` 其中第一个 ...

最新文章

  1. 开发日记-20190615 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  2. Android给自定义按键添加广播和通过广播给当前焦点输入框赋值
  3. java 输入输出头文件_引入的标准头文件与标准输出以及FOR循环
  4. 央视《新闻联播》正式入驻快手平台
  5. Linux内核升级Broadcom网卡问题(bnx2)
  6. day 029 缓冲区和粘包 day 30 粘包的解决
  7. System center virtual machine manager 2008 R2安装部署
  8. ComBox 绑定数据库
  9. Android WiFi 获取 IP 过程
  10. 全网首发:麒麟平台更新时提示错误:无法解析域名“archive.kylinos.cn”
  11. SpringMVC+Vue实现前后端分离的宠物管理系统
  12. mysql 序列号_mysql 序列号生成器(转)
  13. 电子罗盘的工作原理及校准
  14. 如何用R语言做深度学习
  15. android 对话框Dialog拦截activity事件通知
  16. php表单时间控件,phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法...
  17. namecheap域名设置Cloudflare为第三方DNS
  18. 第六章总结-莫凡商城的注册、登录功能
  19. html如何让图片边缘模糊化,如何使用css滤镜获得图像:模糊和锐利的边缘?
  20. 舌苔发白是什么原因造成的?

热门文章

  1. git stash 压栈
  2. 【软件工程】第五章 结构化设计
  3. SAP UI5 智能控件 Smart Controls 的初步认识试读版
  4. deepin linux版本回退,解决Deepin 20下升级360浏览器86内核版就退回78内核版本的问题...
  5. VSCODE+PLANTUML
  6. Unity3D 场景切换异步加载进度
  7. Javascript 日志工具blackbird
  8. 性能服务器图片介绍大全,IDF2012:英特尔22nm处理器图形性能介绍
  9. requests 爬取博客园内容AttributeError: ‘NoneType‘ object has no attribute ‘xpath‘
  10. Dreammail 常见问题