Flask 中的动态路由
发布时间:2023-06-29 14:14:19 所属栏目:教程 来源:
导读:我们已经知道了一条固定的路径和一个处理函数相绑定,当访问这条路径时会触发相应的处理函数。路由中的路径是固定的,一条路径对应一个处理函数,无法处理复杂的情况。本小节介绍动态路由,路由中的路径是一个包含有
我们已经知道了一条固定的路径和一个处理函数相绑定,当访问这条路径时会触发相应的处理函数。路由中的路径是固定的,一条路径对应一个处理函数,无法处理复杂的情况。本小节介绍动态路由,路由中的路径是一个包含有参数的模板,可以匹配多条路径。 1. 静态路由 在前面章节使用的路由中,路径是固定的、不变的。例如,网站中有 3 个用户 tom、jerry、mike,提供了 3 个路径访问这 3 个用户的信息,如下表所示: 路径 处理函数 /user/tom show_user_tom() /user/jerry show_user_jerry() /user/mike show_user_mike() 编写程序 static.py,包含有 3 个路由: 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' app.run() 在第 4 行,将路径 ‘/user/tom’ 与处理函数 show_user_tom () 绑定;在第 8 行,将路径 ‘/user/jerry’ 与处理函数 show_user_jerry () 绑定;在第 12 行,将路径 ‘/user/mike’ 与处理函数 show_user_mike () 绑定。 程序 static.py 存在一个明显的问题:3 个页面处理函数的功能逻辑是相同的,存在有明显的代码重复。在下个小节,使用动态路由解决代码重复的问题。 2. 动态路由 Flask 中动态路由是指带有参数的页面路径,如下所示: /prefix/<参数> 它是一个模板,可以匹配多条路径,将参数放置在符号 <和> 之间。 针对上一节的例子,页面路径 /user/<name> 可以匹配如下 3 个页面路径: /user/tom /user/jerry /user/mike 因此,只需要编写一个页面处理函数即可处理以上 3 个页面,编写程序 dynamic.py: from flask import Flask app = Flask(__name__) @app.route('/user/<name>') def show_user(name): return 'My name is %s' % name app.run() 在第 4 行,定义了动态路径 /user/<name>,匹配所有以 /user/ 开头的路径;在第 5 行,定义了相应的处理函数 show_user,函数有一个参数 name;假设实际的路径是 /user/tom,与 /user/<name> 匹配成功,并且将 tom 存储到参数 name 中。 比较上一个小节 static.py 和本小节的 dynamic.py,通过动态路由可以使用一个处理函数处理一批相关的页面路径,在很多应用场景中是必需的。 3. 转换器 在 Flask 中,参数类型默认是 string,但是也可以指定其他类型,比如数字 int 等,如下所示: /prefix/<类型转换器:参数> 类型转换器将默认的字符串类型转换为指定的类型,Flask 中主要有以下 4 种基本类型转换器: 类型 说明 string 默认,可以不用写 int 整数 float 同 int,但是接受浮点数 path 和 string 相似,但接受斜线 4. 类型转换的例子 本节编写程序 conv.py 演示转换器的功能: 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 app.run() 程序 conv.py 中定义了 4 条动态路由,如下表所示: 动态路由 参数类型 参数 处理函数 /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> /user/tom My name is tom /age/<int:age> /age/26 age is 26 /price/<float:price> /price/31.4 price is 31.4 /path/<path:name> /path/abc/xyz path is abc/xyz (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |