Flask路由的使用

devtools/2024/9/23 14:30:19/

Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探讨 Flask 路由的多种用法,包括创建路由、经典路由、动态路由等。

创建路由

在 Flask 中,通过装饰器 @app.route() 可以轻松地创建路由。下面是一个简单的示例:

python">from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Hello, Flask!'

上述代码中,@app.route('/') 表示将 URL / 映射到了名为 index 的视图函数上,当用户访问根目录时,将会返回 ‘Hello, Flask!’。

经典路由

经典路由即静态路由,它直接将 URL 与视图函数一一对应。例如:

python">@app.route('/about')
def about():return 'About Us'

上述代码中,当用户访问 /about 时,将会触发名为 about 的视图函数,返回 ‘About Us’。

动态路由

动态路由允许在 URL 中包含可变的部分,这使得我们能够处理更加灵活的请求。例如,我们可以接受用户传递的参数:

python">@app.route('/user/<username>')
def show_user_profile(username):return 'User %s' % username

在上述示例中,<username> 表示动态部分,Flask 将会将实际的用户名作为参数传递给视图函数 show_user_profile

给动态路由设定变量类型

默认情况下,动态路由中的变量被视为字符串。但是,我们可以使用 <converter:variable_name> 的语法指定变量的类型。常见的类型包括 intfloatpath 等。

python">@app.route('/post/<int:post_id>')
def show_post(post_id):return 'Post %d' % post_id

上述示例中,<int:post_id> 指定了 post_id 应当是一个整数。

  • converter用于指定变量类型
  • variable_name表示变量名

  • 类型参考表
URL规则描述示例
/user/<string:username>字符串类型。匹配任何字符串,不包括斜杠/user/johndoe
/post/<int:post_id>整数类型。匹配正整数。/post/123
/price/<float:price>浮点数类型。匹配浮点数。/price/9.99
/path/<path:path>路径类型。匹配包含斜杠的字符串。/path/foo/bar
/uuid/<uuid:uuid_value>UUID 类型。匹配 UUID 格式的字符串。/uuid/123e4567-e89b-12d3-a456-426614174000
/any/<any:any_value>任意类型。匹配任何类型的字符串。 /<any(geek,item):tmp>/<int:id>
  • 各种类型参考
python">from flask import Flaskapp = Flask(__name__)# 字符串类型
@app.route('/user/<string:username>')
def user_profile(username):return f'User Profile: {username}'# 整数类型
@app.route('/post/<int:post_id>')
def show_post(post_id):return f'Showing post #{post_id}'# 浮点数类型
@app.route('/price/<float:price>')
def show_price(price):return f'The price is: {price}'# 路径类型
@app.route('/path/<path:path>')
def show_path(path):return f'The path is: {path}'# UUID类型
@app.route('/uuid/<uuid:uuid_value>')
def show_uuid(uuid_value):return f'The UUID is: {uuid_value}'# 任意类型
@app.route('/<any(geek,item):tmp>/<int:id>')
def get_any(tmp, id):if tmp == "geek":return f"geek:{id}"elif tmp == "item":return f"item:{id}"else:return Noneif __name__ == '__main__':app.run(debug=True)

自定义路由变量类型

除了内置的变量类型外,我们还可以自定义路由变量类型。通过在应用对象上注册转换器,我们可以创建自己的转换逻辑。

python">import typing as tfrom flask import Flask
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义手机号码类型转换器
class PhoneConverter(BaseConverter):regex = "1[1-9]\d{9}"def to_python(self, value: str) -> t.Any:return int(value)# 注册自定义手机号码类型转换器
app.url_map.converters['phone'] = PhoneConverter# 使用自定义手机号码类型转换器的动态路由
@app.route('/phone/<phone:user_phone>')
def user_profile(user_phone):return f'你的手机号是: {user_phone}'if __name__ == '__main__':app.run(debug=True)

结语

通过本文的介绍,我们对 Flask 路由的使用有了更深入的了解。除了基本的路由创建外,我们还学习了如何处理动态路由,以及如何自定义路由变量类型。这些功能使得 Flask 在构建 Web 应用时更加灵活和强大。希望本文对您有所帮助!


http://www.ppmy.cn/devtools/28126.html

相关文章

用Jenkins实现cherry-pick多个未入库的gerrit编译Android固件

背景: 在做Android固件开发的时候,通常我们可以利用gerrit-trigger插件,开发者提交一笔的时候自动触发jenkins编译,如果提交的这一笔的编译依赖其他gerrit才能编译过,我们可以在commit message中加入特殊字段,让jenkins在编译此笔patch的时候同时抓取依赖的gerrit代码下…

在线音频,没有新故事

图片&#xff5c;自象限拍摄 ©自象限原创 作者丨艾AA 编辑丨罗辑 没有一家公司的IPO之路如喜马拉雅这样曲折。一而再&#xff0c;再而三&#xff0c;从2021年9月&#xff0c;到2022年3月&#xff0c;每一次都似乎触手可及&#xff0c;却又每一次都在最后关头功亏一篑。…

OpenHarmony语言基础类库【@ohos.util.TreeSet (非线性容器TreeSet)】

TreeSet基于[TreeMap]实现&#xff0c;在TreeSet中&#xff0c;只对value对象进行处理。TreeSet可用于存储一系列值的集合&#xff0c;元素中value唯一且有序。 TreeSet和[HashSet]相比&#xff0c;HashSet中的数据无序存放&#xff0c;而TreeSet是有序存放。它们集合中的元素…

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

学习java第五十八天

自动装配有哪些方式&#xff1f; 自动装配的不同模式&#xff1a; no - 这是默认设置&#xff0c;表示没有自动装配。应使用显式 bean 引用进行装配。 byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。 byType - 它根据类型…

前端安全:XSS和CSRF攻击的防御策略

在前端开发中&#xff0c;确保应用的安全性是至关重要的任务之一。跨站脚本攻击&#xff08;XSS&#xff09;和跨站请求伪造&#xff08;CSRF&#xff09;是两种常见的安全威胁&#xff0c;它们可以严重危害网站的安全和用户的隐私。以下是针对这两种攻击的防御策略&#xff1a…

Unity3D初级实战项目之方块跑酷

目录 初始化项目开发环境初始化项目屏幕自适应 游戏UI界面元素布局开始界面UI角色选择&#xff08;商城&#xff09;界面UI游戏界面UI 地图生成算法之菱形布局Resources资源加载代码生成地图菱形布局 地图生成算法之墙壁边界菱形地图双排布局地图瓷砖颜色美化墙壁边界生成 地图…

vue2主体页面进行拆分

目录 一.组件化 二.新建Header.vue页面 三.Aside.vue代码 四.Main.vue代码如下 五.Home.vue代码如下 六.index.js代码如下: 七.项目效果图 在Vue.js 2中,将主体页面进行拆分是一种常见的做法,它有