无论是Django,还是Flask或者别的web框架的路由的目的都是建立url和函数的对应关系。

对于Flask,他的路由使用装饰器来完成。

最简单的路由

@app.route('/')
def index():return 'Index Page'@app.route('/hello')
def hello():return 'Hello World'

basic_url

route() 装饰器把一个函数绑定到对应的 URL 上。

动态路由

我们经常看到类似http://www.cnblogs.com/yangshl/的url。这里的yangshl是我的博客园的用户名。在Fask中也有带变量的路由。

给 URL 增加变量的部分,把一些特定的字段标记作为参数传入到函数中。当然也可以指定一个可选的转换器通过规则 。

@app.route('/<path:username>/<pid>/hello')
def hello_world(pid, username):print("pid", pid)print("username", username)return 'Hello World!'

View Code

若url是:http://127.0.0.1:8090/kelly/hi/28/hello

则我们截取到

pid 28
username kelly/hi

这说明函数中参数的顺序可以和url中变量的顺序不一致,他们是按照关键字来传参的。而且路由的前后都可以固定的url部分。

其中:path是路由转换器。

实际上Flask有如下几个路由转换器:

  • 'default': <class 'werkzeug.routing.UnicodeConverter'>
  • 'string': <class 'werkzeug.routing.UnicodeConverter'>
  • 'any': <class 'werkzeug.routing.AnyConverter'>
  • 'path': <class 'werkzeug.routing.PathConverter'>
  • 'int': <class 'werkzeug.routing.IntegerConverter'>
  • 'float': <class 'werkzeug.routing.FloatConverter'>
  • 'uuid': <class 'werkzeug.routing.UUIDConverter'>

我们通过url传递的变量都是字符串,可以通过转换器来来进行转换类型和规定它匹配的格式。比如int,若我么传入了abc,则不匹配,会报404错误。

自定义路由转换器。

class RegexConverter(BaseConverter):def __init__(self, map, *args):self.map = mapself.regex = args[0]

# 注册转换器
app.url_map.converters['regex'] = RegexConverter

@app.route('/view/<regex("[0-9\.,]+"):uuid>/')
def view(uuid):
  return "view uuid: %s" % (uuid)

再进一步:self.regex到底是什么?
Flask(其实是Werkzeug)使用Converter把URL中特殊部分(<regex("[a-zA-Z0-9]+"):uuid>)转换为Python变量,通用格式是<converter(args):var_name>。在这个例子中,一个叫regex的converter把URL中相应字段转换为view()中的uuid变量。
因此,converter的regex就是用来判断这串字符是否符合转换格式,ok就转换,否则跳过。对于IntegerConverter来说,"abc"显然无能为力。也就是说,其实Werkzeug的路由本来就支持用正则表达式。string、int、float等都是从它派生出来的(可以看看IntegerConverter等built-in Converter的regex)。
至于为什么不显式地支持,我猜可能是因为正则表达式不容易写好,buggy。

反向路由

本质是根据函数名反向生成url,使用函数 url_for() 来针对一个特定的函数构建一个 URL。它能够接受函数名作为第一参数,以及一些关键字参数, 每一个关键字参数对应于 URL 规则的变量部分。未知变量部分被插入到 URL 中作为查询参数。

with app.test_request_context():
  print(url_for('hello_world', username = 'kelly', pid = '12'))

则得到的url是:/kelly/12/hello

若url_for('hello_world', username = 'kelly', pid = '12', _external=True)则返回完整路径:

http://localhost/kelly/12/hello

反向路由在Jinja2中也有使用,用于引入一些静态文件。

总之:路由是url和处理函数之间的桥梁。

转载于:https://www.cnblogs.com/yangshl/p/6408084.html

Flask-第二课:路由相关推荐

  1. 第二课 SS7信令系统网络简介

    第二课 SS7信令系统网络简介 课程目的: 描述SS7信令网络的基本元素: 信令点(SSP,SCP,STP) 链路和链路集 路由和路由集 计算一条信令链路的信息传输容量 论述SS7信令拓普结构的可靠性 ...

  2. 《迅雷链精品课》第二课:区块链核心技术框架

    上一节课我们明白了什么是区块链,了解了区块链的关键特性和技术等内容,这节课我们将深入了解区块链的技术架构,系统学习区块链平台的6个层次:数据层.网络层.共识层.合约层.应用层.接口层,另外通常还有客户 ...

  3. 一步步带你做vue后台管理框架(二)——上手使用 系列教程《一步步带你做vue后台管理框架》第二课

    github地址:vue-framework-wz 线上体验地址:立即体验 <一步步带你做vue后台管理框架>第一课:介绍框架 <一步步带你做vue后台管理框架>第二课:上手使 ...

  4. 第二课 如何在WINDOWS环境下搭建以太坊开发环境

    [本文目标] 根据本文指导,可以在WINDOUWS环境下完成以太坊智能合约部署前的比较环境准备. [技术收获] 如何在WINDOW(笔者以WINDOWS 10为例)环境搭建以太坊开发环境,按照以下安装 ...

  5. 第二课 Beego仿优酷-go环境安装和Beego框架基础

    第二课 Beego仿优酷-go环境安装和Beego框架基础 tags: Beego 慕课网 categories: go环境安装 Beego框架 文章目录 第二课 Beego仿优酷-go环境安装和Be ...

  6. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  7. android 集合 内存泄漏,Android内存泄漏第二课--------(集合中对象没清理造成的内存泄漏 )...

    一.我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大.如果这个集合是static的话,那情况就更严重 ...

  8. cdata节 赋值变量_JS原生练习题:第二课第5~12节

    第五节:函数传参,改变Div任意属性的值 函数传参,改变Div任意属性的值 属性名: 属性值: 确定 重置 在上方输入"属性名"和"属性值",点击确认按钮查看效 ...

  9. 0.0 目录-深度学习第二课《改善神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  10. Coursera公开课笔记: 斯坦福大学机器学习第二课“单变量线性回归(Linear regression with one variable)”

    Coursera公开课笔记: 斯坦福大学机器学习第二课"单变量线性回归(Linear regression with one variable)" 发表于 2012年05月6号 由 ...

最新文章

  1. java程序设计 徐红_Java程序设计-徐红 王灿
  2. ngrok linux开机自启动,CentOS 搭建ngrok服务器
  3. ML之回归预测:利用两种机器学习算法(LiR,XGBoost(调优+重要性可视化+特征选择模型))对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值
  4. java替换html样式_Java Jsoup替换标签的CSS样式
  5. 拼图项目的动机和目标
  6. Spring Boot快速注册服务脚本
  7. Oracle数据库基础知识(二)
  8. C# socket编程TcpClient与TcpListener UdpClient
  9. 【从零开始的OpenGL学习】1. 配置OpenGL,绘制最简单的一个三角形,HelloWorld(学习笔记)
  10. 平均销售额计算机公式,销售额是什么意思(销售额的基本计算公式)
  11. 有测试狗狗好坏的软件吗,6个测试判断狗狗性格,胆小或凶猛一测便知,你家狗狗是哪种?...
  12. Altium_Protel99SE圆线路板添加工艺边
  13. vsual studio 如何关闭禁止mscorsvw.exe (转)
  14. 对京东云鼎的学习笔记
  15. python假期培训班
  16. Java基础-进程与线程
  17. 2021新手找货源技巧来啦!萌啦货源手把手教你选品!
  18. java拼音分词_使用Pinyin4j进行拼音分词的方法
  19. html $符号的作用,javascript 中$符号是代表什么意思!
  20. ZUCC_Linux系统管理_实验七 LVM

热门文章

  1. Alibaba Druid未授权访问漏洞记录(敏感目录,端口:不确定)
  2. python 判断文件夹或文件是否存在
  3. python制作各种条形图
  4. oracle中的日期查询在mybatis中写法
  5. G - Hard problem CodeForces - 706C DP
  6. 工作中遇到的问题--使用注解进行增加删除修改的验证
  7. Install and run DB Query Analyzer 6.04 on Microsoft Windows 10
  8. STM32之SDIO例程
  9. android studio 引入httpclient,HttpClient不会导入Android Studio
  10. 面试官:你给我画一下秒杀系统的架构图!