【Flask 系统教程 2】路由的使用

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

创建路由

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

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Flask!'

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


使用add_url_rule创建路由

在 Flask 中,除了使用装饰器 @app.route 来定义路由外,你还可以使用 add_url_rule 方法来手动添加路由。add_url_rule 方法允许你在 Flask 应用中动态地添加路由规则,这在一些特定场景下可能会很有用,例如在运行时根据配置信息添加路由。

  • 语法如下:
app.add_url_rule(rule, endpoint=None, view_func=None, **options)
  • rule:URL 规则,即路由的路径。
  • endpoint:端点名称,选填,用于标识路由(即 url_for函数对应使用的标识名)。
  • view_func:视图函数,处理路由请求的函数。
  • options:其他路由选项,例如 methodsdefaults 等。

  • 示例
from flask import Flask

app = Flask(__name__)

def hello_world():
    return 'Hello, World!'

# 使用 add_url_rule 方法添加路由,并指定支持的请求方法
app.add_url_rule('/', 'hello', hello_world, methods=['GET', 'POST'])

# 如果不设置methods,默认使用GET
if __name__ == '__main__':
    app.run(debug=True)

在这个示例中,我们首先定义了一个视图函数 hello_world,它返回字符串 'Hello, World!'。然后,我们使用 add_url_rule 方法手动添加了一个路由,将根路径 / 映射到 hello_world 视图函数,并指定了端点名称为 'hello'

  • 注意事项
  • 当使用 add_url_rule 方法手动添加路由时,需要确保视图函数已经定义。
  • 如果你使用了 add_url_rule 方法添加路由,那么你不能再使用 @app.route 装饰器添加相同的路由,否则会出现路由冲突。

经典路由

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

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

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

动态路由

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

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

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

给动态路由设定变量类型

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

@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>
  • 各种类型参考
from flask import Flask

app = 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 None


if __name__ == '__main__':
    app.run(debug=True)

自定义路由变量类型

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

import typing as t

from flask import Flask
from werkzeug.routing import BaseConverter

app = 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)

自定义类中的 to_python函数决定访问后传入路由对应函数得到的Python对象是什么。

url_for函数

url_for 函数是 Flask 框架提供的一个便捷工具,用于构建 URL。它接受视图函数的名称作为参数,并返回该视图函数对应的 URL。使用 url_for 的主要好处是,它允许您在应用程序中动态地生成 URL,而不必硬编码它们。

下面是 url_for 函数的基本用法:

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'

@app.route('/user/<username>')
def profile(username):
    return f'Hello, {username}!'

if __name__ == '__main__':
    with app.test_request_context():
        print(url_for('index'))  # 输出: /
        print(url_for('profile', username='john'))  # 输出: /user/john
/
/user/john

在上面的示例中,当您调用 url_for('index') 时,它会返回根路径 / 对应的 URL。当您调用 url_for('profile', username='john') 时,它会返回匹配 profile 路由规则并传递 username 参数的 URL,例如 /user/john

url_for 还接受其他参数,比如 external_schemeexternal 参数用于生成绝对 URL,而不仅仅是相对路径。_scheme 参数用于指定 URL 的协议(例如 httphttps)。

with app.test_request_context():
    print(url_for('index', _external=True))  # 输出: http://localhost/
http://localhost/

url_for 函数是 Flask 应用程序中非常实用的工具,可以帮助您轻松地构建 URL,使得代码更加清晰和可维护。

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/593126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——行为型模式——策略模式

策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&a…

【ARM Cortex-M3指南】3:Cortex-M3基础

文章目录 三、Cortex-M3基础3.1 寄存器3.1.1 通用目的寄存器 R0~R73.1.2 通用目的寄存器 R8~R123.1.3 栈指针 R133.1.4 链接寄存器 R143.1.5 程序计数器 R15 3.2 特殊寄存器3.2.1 程序状态寄存器3.2.2 PRIMASK、FAULTMASK和BASEPRI寄存器3.2.3 控制寄存器 3.3 操作模式3.4 异常…

# 在 Windows 命令提示符(cmd)中,可以通过以下方法设置长命令自动换行

在 Windows 命令提示符&#xff08;cmd&#xff09;中&#xff0c;可以通过以下方法设置长命令自动换行 1、点击 cmd 窗口左上角标题栏&#xff0c;选择【属性】。 2、在【属性】菜单中&#xff0c;依次点击【选项】&#xff0c;找到【编辑选项】下面的【自动换行】&#xff…

经纬度聚类:聚类算法比较

需求&#xff1a; 将经纬度数据&#xff0c;根据经纬度进行聚类 初始数据 data.csv K均值聚类 简介 K均值&#xff08;K-means&#xff09;聚类是一种常用的无监督学习算法&#xff0c;用于将数据集中的样本分成K个不同的簇&#xff08;cluster&#xff09;。其基本思想是…

OpenCV | 入门

OpenCV | 入门 安装 参考教程 基础知识 V G A 640 480 VGA 640 \times 480 VGA640480 H D 1280 720 HD 1280 \times 720 HD1280720 F H D 1920 1080 FHD 1920 \times 1080 FHD19201080 4 K 3840 2160 4K 3840 \times 2160 4K38402160 这些都表示了固定的像素…

AI-数学-高中52-离散型随机变量概念及其分布列、两点分布

原作者视频&#xff1a;【随机变量】【一数辞典】2离散型随机变量及其分布列_哔哩哔哩_bilibili 离散型随机变量分布列&#xff1a;X表示离散型随机变量可能在取值&#xff0c;P:对应分布在概率&#xff0c;P括号里X1表示事件的名称。 示例&#xff1a;

机器学习的指标评价

之前在学校的小发明制作中&#xff0c;在终期答辩的时候&#xff0c;虽然整个项目的流程都答的很流畅。 在老师提问的过程中&#xff0c;当老师问我recall,precision,accuracy等指标是如何计算的&#xff0c;又能够表示模型的哪方面指标做得好。我听到这个问题的时候&#xff…

使用FPGA实现串-并型乘法器

介绍 其实我们知道&#xff0c;用FPGA实现乘法器并不是一件很简单的事&#xff0c;而且在FPGA中也有乘法器的IP核可以直接调用&#xff0c;我这里完全就是为了熟悉一些FPGA的语法然后写了这样一个电路。 串-并型乘法器模块 从字面上看&#xff0c;串-并乘法器就是其中一个乘数…

深入学习Redis(1):Redis内存模型

Redis的五个对象类型 字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合&#xff0c;有序集合 本节有关redis的内存模型 1.估算redis的内存使用情况 目前内存的价格比较的高&#xff0c;如果对于redis的内存使用情况能够进行计算&#xff0c;就可以选用合适的设备进…

初识webpack项目

新建一个空的工程 -> % mkdir webpack-project 为了方便追踪执行每一个命令&#xff0c;最终产生了哪些变更&#xff0c;将这个空工程初始化成git项目 -> % cd webpack-project/-> % git init Initialized empty Git repository in /Users/lixiang/frontworkspace/…

多级留言/评论的功能实现——SpringBoot3后端篇

目录 功能描述数据库表设计后端接口设计实体类entity 完整实体类dto 封装请求数据dto 封装分页请求数据vo 请求返回数据 Controller控制层Service层接口实现类 Mapper层Mybatis 操作数据库 补充&#xff1a;返回的数据结构自动创建实体类 最近毕设做完了&#xff0c;开始来梳理…

https自签名ssl证书生成流程

准备工作&#xff1a; 0.安装完整版的openssl openssl下载官网 安装到C:\OpenSSL32&#xff0c;也可以安装到其它盘&#xff0c;不要包含空格和中文 打开openssl.exe所在目录如:C:\OpenSSL32\bin&#xff0c;输入cmd.exe打开cmd控制台 1.创建ca文件夹 ,证书文件夹 mkdir …

二维泊松方程(三角形区域)Matlab有限元编程求解|案例源码+说明文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

【Linux 进程】 自定义shell

目录 关于shell 1.打印提示符&&获取用户命令字符​编辑 2.分割字符串 3.检查是否为内建命令 cd命令 export命令 echo命令 1.输出最后一个执行的命令的状态退出码&#xff08;返回码&#xff09; 2.输出指定环境变量 4.执行外部命令 关于shell Shell 是计算机操…

C语言数组介绍

文章目录 一、数组的概念二、一维数组1.一维数组的创建2.一维数组的初始化3.数组的类型4.一维数组的使用5.一维数组在内存中的存储6.sizeof计算数组元素个数 三、二维数组1.二维数组的概念2.二维数组的创建3.二维数组的初始化4.二维数组的使用5.二维数组的输入和输出6.二维数组…

【教学类-50-09】20240505“数一数”图片样式09:数一数(几何图案——透明颜色重叠+纯黑边框+黑框粗细)

背景需求&#xff1a; 【教学类-50-03】20240408“数一数”图片样式03&#xff1a;透明图形与边框不相交&#xff0c;透明图形和其他透明图形重叠-CSDN博客文章浏览阅读867次&#xff0c;点赞28次&#xff0c;收藏25次。【教学类-50-03】20240408“数一数”图片样式03&#xf…

银行ETL-监管报送

1104报表 1104报表主要包括&#xff1a;资产负债&#xff0c;表外业务、流动性风险、贷款质量、投向行业和地区、重点客户等。 1104报表分类 普通报表、机构特色类报表。 反洗钱 大额交易、可疑交易。标签分类&#xff1a;疑似犯罪、疑似毒品、疑似传销。 反洗钱—接口报…

tomcat+maven+java+mysql图书管理系统2-完善项目结构,添加相关依赖

1.创建java目录 接着选择java&#xff0c;回车&#xff0c;则创建成功&#xff0c;成功后在左侧栏能看见 2.修改pom.xml文件,(添加依赖) <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

pandas读取文件导致jupyter内核崩溃如何解决

读取execl文件出现以下问题: str_name "D:\\cao_use\\2017_2021(new).xlsx" train_df pd.read_excel(str_name, usecols[0])崩溃的指示图如下所示: bug原因:读入的文件太大&#xff0c;所需时间过长&#xff0c;在读取的过程中&#xff0c;使用中断按钮暂停会直…