Flask(5)- 动态路由
前言
- 前面几篇文章讲的路由路径(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)- 动态路由的更多相关文章
- 11.2 Flask 配置文件,路由系统
配置文件系统 构建 Flask 应用时指定 app = Flask( __name__, template_folder = '', # 指定存储模板文件夹名称 static_url_path = ' ...
- Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)
一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...
- Flask中的路由、实例化参数和config配置文件
Flask中的路由 endpoint 别名不能重复,对应的视图函数,默认是视图函数名.endpoint 才是路由的核心.视图函数与路由的对应关系.可以通过url_for 反向创建url # metho ...
- 第六篇 Flask中的路由系统
Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...
- Flask中的路由配置
在Flask中也同样有django中的路由配置只不过没有djngo那么严格主要的参数有一下六个记住常用的就可以了 1.endpoint 反向生成url地址标志,默认视图函数名 2.methods ...
- AIX 环境下动态路由
IBM AIX v5.3操作系统环境下动态路由配置如下: 1,用命令lssrc -S routed和lssrc -S gated分别检查routed和gated子系统是是活动状态.如果这两个子系统为活 ...
- asp.net MVC动态路由
项目中遇到需要动态生成控制器和视图的. 于是就折腾半天,动态生成控制器文件和视图文件,但是动态生成控制器不编译是没法访问的. 找人研究后,得到要领: 1.放在App_Code文件夹内 2.不要命名空间 ...
- RIP、OSPF、BGP、动态路由选路协议、自治域AS
相关学习资料 tcp-ip详解卷1:协议.pdf http://www.rfc-editor.org/rfc/rfc1058.txt http://www.rfc-editor.org/rfc/rfc ...
- Ngnix技术研究系列2-基于Redis实现动态路由
上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...
随机推荐
- 云计算OpenStack---云计算、大数据、人工智能(14)
一.互联网行业及云计算 在互联网时代,技术是推动社会发展的驱动,云计算则是一个包罗万象的技术栈集合,通过网络提供IAAS.PAAS.SAAS等资源,涵盖从数据中心底层的硬件设置到最上层客户的应用.给我 ...
- 僵尸进程和孤儿进程-(转自Anker's Blog)
2.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当 ...
- 图解 Redis | 不就是 AOF 持久化嘛
AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了 ...
- GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...
- sql批量插入缓慢
1.有一个普通的表t_asset,只有2个字段id,ip 没有索引 2.当用insert into t_asset(id,ip) values(?,?),(?,?) 1200多条记录时,发现竟然用了3 ...
- TensorFlow实现多层感知机MINIST分类
TensorFlow实现多层感知机MINIST分类 TensorFlow 支持自动求导,可以使用 TensorFlow 优化器来计算和使用梯度.使用梯度自动更新用变量定义的张量.本文将使用 Tenso ...
- 深度学习调用TensorFlow、PyTorch等框架
深度学习调用TensorFlow.PyTorch等框架 一.开发目标目标 提供统一接口的库,它可以从C++和Python中的多个框架中运行深度学习模型.欧米诺使研究人员能够在自己选择的框架内轻松建立模 ...
- 在NVIDIA-Jetson平台上构建智能多媒体服务器
在NVIDIA-Jetson平台上构建智能多媒体服务器 Building a Multi-Camera Media Server for AI Processing on the NVIDIA Jet ...
- UiPath 中 List 集合的实例化与使用
>>>跳过BB,空降正文<<< 目录 前言 正文 1. 创建 List 变量 2. 实例化 List 变量 3. 集合的使用 后记 前言 大家好呀,我是 白墨,一个 ...
- Spring Bean 的生命周期总结
除了使用阶段外,Spring 将 bean 的生命周期定义为实例化.属性填充.初始化和销毁四个阶段,并为每个阶段提供了多个拓展点用于自定义 bean 的创建过程.这篇文章介绍了 bean 的生命周期和 ...