前言

  • 前面几篇文章讲的路由路径(rule)都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处理函数
  • 这样无法处理复杂的情况,比如常见的一个课程分类下有很多个课程,那么他们的 path 可能是 /course/class_1,/course/class_2,/course/class_3...仅最后的序号不同,其他部分都是相同的,如果每一条 path 都写一个单独的视图函数来处理,那复用性会很差,代码量也会很多
  • 所以咱们要使用动态路由,路由中的路径是一个包含有参数的模板,这样就可以匹配多条路径

静态路由的栗子

网站中有 3 个用户 tom、jerry、mike,提供了 3 个路由访问这 3 个用户的信息

路由 视图函数
/user/tom show_user_tom()
/user/jerry show_user_jerry()
/user/mike show_user_mike()
from flask import Flask

app = Flask(__name__)

@app.route('/user/tom')
def show_user_tom():
return 'My name is tom' @app.route('/user/jerry')
def show_user_jerry():
return 'My name is jerry' @app.route('/user/mike')
def show_user_mike():
return 'My name is mike' if __name__ == '__main__':
app.run()

静态路由存在的问题

三个视图函数的功能逻辑是相同的,存在明显的逻辑代码重复

动态路由

Flask 中动态路由是指带有参数的页面路径,大概格式如下

/prefix/<参数>

它是一个模板,可以匹配多条路径,将参数放置在符号 < > 之间

将上面的静态路由栗子优化成动态路由

from flask import Flask

app = Flask(__name__)

@app.route('/user/<name>')
def show_user(name):
return 'My name is %s' % name if __name__ == '__main__':
app.run()
  • 匹配所有以 /user/ 开头的路径
  • 视图函数 show_user 有一个参数 name
  • 假设实际的路径是 /user/poloyy,那么会与 /user/<name> 匹配成功,并且将 poloyy 存储到参数 name 中

实际请求结果

转换器

在 Flask 中,动态路由的参数类型默认是 string,但是也可以指定其他类型,比如数字 int 等

类型 说明
string 默认,可以不用写
int 整数
float 同 int,但是仅接受浮点数
path 和 string 相似,但接受斜线

转换器的栗子代码

from flask import Flask

app = Flask(__name__)

@app.route('/user/<name>')
def show_user(name):
return 'My name is %s' % name @app.route('/age/<int:age>')
def show_age(age):
return 'age is %d' % age @app.route('/price/<float:price>')
def show_price(price):
return 'price is %f' % price @app.route('/path/<path:name>')
def show_path(name):
return 'path is %s' % name if __name__ == '__main__':
app.run()

上述代码定义了四条动态路由

动态路由 参数类型 参数 视图函数
/user/<name> 字符串 name show_user
/age/<int:age> int age show_age
/price/<float:price> float price show_price
/path/<path:name> path name show_path

/user/<name> postman 发起请求的结果

直接看上面的栗子截图就好了,这里给一个踩坑的栗子

如果 <name> 传了包含 / 的话,会报 404 哦

/age/<int:age> postman 发起请求的结果

传整数

传浮点点数

会直接报 404 哦!

/price/<float:price> postman 发起请求的结果

传浮点数

传整数

会直接报 404 哦!

/path/<path:name> postman 发起请求的结果

包含 / 的时候也可以正常请求

没有 / 的时候,和 string 类型一样

一个动态路由包含多个参数

@app.route('/all/<path:path>/name/<string:name>/age/<int:age>/price/<float:price>')
def show_all(name, path, age, price):
return f"path is {path}\nname is {name}\nage is {age}\nprice is {price}"

postman 发起请求的结果

总结

Flask(5)- 动态路由的更多相关文章

  1. 11.2 Flask 配置文件,路由系统

    配置文件系统 构建 Flask 应用时指定 app = Flask( __name__, template_folder = '', # 指定存储模板文件夹名称 static_url_path = ' ...

  2. Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)

    一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...

  3. Flask中的路由、实例化参数和config配置文件

    Flask中的路由 endpoint 别名不能重复,对应的视图函数,默认是视图函数名.endpoint 才是路由的核心.视图函数与路由的对应关系.可以通过url_for 反向创建url # metho ...

  4. 第六篇 Flask中的路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  5. Flask中的路由配置

    在Flask中也同样有django中的路由配置只不过没有djngo那么严格主要的参数有一下六个记住常用的就可以了 1.endpoint   反向生成url地址标志,默认视图函数名 2.methods ...

  6. AIX 环境下动态路由

    IBM AIX v5.3操作系统环境下动态路由配置如下: 1,用命令lssrc -S routed和lssrc -S gated分别检查routed和gated子系统是是活动状态.如果这两个子系统为活 ...

  7. asp.net MVC动态路由

    项目中遇到需要动态生成控制器和视图的. 于是就折腾半天,动态生成控制器文件和视图文件,但是动态生成控制器不编译是没法访问的. 找人研究后,得到要领: 1.放在App_Code文件夹内 2.不要命名空间 ...

  8. RIP、OSPF、BGP、动态路由选路协议、自治域AS

    相关学习资料 tcp-ip详解卷1:协议.pdf http://www.rfc-editor.org/rfc/rfc1058.txt http://www.rfc-editor.org/rfc/rfc ...

  9. Ngnix技术研究系列2-基于Redis实现动态路由

    上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...

随机推荐

  1. Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播。

    Linux是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播. Linux是众多操作系统之一 , 目前流行的服务器和 PC 端操作系统有 L ...

  2. python基础之列表、元组

    一.列表 列表(list)是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[ ]内可以有多个任意类型的值,逗号 ...

  3. STM32标准外设库中USE_STDPERIPH_DRIVER, STM32F10X_MD的含义

    在项目中使用stm32标准外设库(STM32F10x Standard Peripherals Library)的时候,我们会在项目的选项中预定义两个宏定义:USE_STDPERIPH_DRIVER, ...

  4. HarmonyOS去除页面顶部title的方式

    在config.json文件中module节点中添加如下代码 "metaData":{ "customizeData":[ { "name" ...

  5. mysql数据库-日志管理

    MySQL 支持丰富的日志类型 事务日志:transaction log 事务日志的写入类型为"追加",因此其操作为"顺序IO":通常也被称为:预写式日志 wr ...

  6. unity 使用OnDrag实现物体旋转

    通过监听UGUI的OnDrag事件 实现对3D物体的旋转 实现IDragHandler接口 void IDragHandler.OnDrag(PointerEventData eventData) { ...

  7. volatile 关键字笔记

    你应该知道的 volatile 关键字 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据. ...

  8. Go语言协程并发---select多路复用应用

    package main import ( "fmt" "time" ) /* ·循环从一写两读三条管道中随机选择一条能走的路 ·等所有路都走不通了就退出循环 ...

  9. Jmeter- 笔记7 - 服务器监控(ServerAgent配置)

    文件:ServerAgent - 2.2.3.zip  放网盘了 在服务器的操作:只需要把这个文件上传到被监控服务器,然后解压,启动sh startagent.sh --udp-port 0 --tc ...

  10. Redis系列(三):Bitmaps和HyperLogLog

    本篇介绍Bitmaps和HyperLogLog. 一.Bitmaps 计算机中最小的单位是bit(位),很多计算机语言也提供了位操作符,比如Java中就有&.|.>>.>&g ...