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

news2024/11/17 7:34:29

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 应用时更加灵活和强大。希望本文对您有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于安装Tensorflow的一些操作及问题解决

关于conda和tensorflow&#xff1a; 由于在安装tensorflow遇到各种问题&#xff0c;遇坑则进&#xff0c;耗费了很多时间。由此想整理一些关于安装tensorflow的操作和方法。欢迎各位补充和指正&#xff01; 1.conda: 1&#xff09;conda list 查看安装了哪些包。 2&#xff…

OpenCV人脸识别C++代码实现Demo

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它提供了很多函数&#xff0c;这些函数非常高效地实现了计算机视觉算法。 官网&#xff1a;https://opencv.org/ Github: https://github.com/opencv/opencv Gitcode…

如何打包Apk适配32和64位

一个表格了解lib下的文件夹 .so文件描述armeabi-v7a第七代及以上的ARM处理器&#xff0c;2011年以后生产的大部分Android设备都使用。arm64-v8a第8代、64位ARM处理器&#xff0c;很少设备&#xff0c;三星GalaxyS6是其中之一。armeabi第5代、第6代的ARM处理器&#xff0c;早期…

C语言数据结构之队列

目录 1.队列的概念及结构2.队列的实现逻辑3.队列的代码实现4.相关例题选择题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#x…

Ubuntu系统安装nvfortran详细步骤【笔记】

实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; Ubuntu系统安装NVFORTRAN&#xff08;NVIDIA Fortran Compiler&#xff09;步骤如下&#xff1a; 安装依赖项&#xff1a;在安装NVFORTRAN之前&#xff0c;你需要确保系统已经安装了一些必要…

IoTDB 入门教程 基础篇①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道&#xff0c;博主在物联网领域深耕多年。 时序数据库&#xff0c;博主已经用过很多&#xff0c;从最早的InfluxDB&a…

c语言刷题——输出图案

1.输出用“*”组成的X形图案 题目&#xff1a;请打印用“*”组成的X形图案 描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输…

一觉醒来 AI科技圈发生的大小事儿 05月04日

&#x1f4f3;CVPR 2024 Highlight | 基于单曝光压缩成像&#xff0c;不依赖生成模型也能从单张图像中重建三维场景 本文介绍了一种基于单曝光压缩成像&#xff08;SCI&#xff09;系统和神经辐射场&#xff08;NeRF&#xff09;的三维场景拍摄与重建方法&#xff0c;实现了不…

杭电acm2018 母牛的故事 Java解法 经典递归

标准递归题 先模拟 接着找递归出口 再找递归通式 想想看 今天的母牛等于前一天的母牛数加上今天出生的母牛 而三天前的母牛所有母牛都能生一头 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);l…

单例、工厂、策略、装饰器设计模式

1. 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 单例模式是一种常用的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这种模式的特点是类自己负责保存其唯一的实例&#xff0c;并控制其实例化过程。单例模式广泛应用…

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16&#xff09;检索"1"课程分数小于60&#xff0c;按分数降序排列的学生信息​ 17&#xff09;*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18&#xff09;*查询各科成绩最高分、最低分和平均分 19&#xff09;*按各科成绩…

【在线oj系统】02-开发环境版本说明

目录 一、前置环境版本介绍 二、SpringCloud组件停更/替换/更新 服务注册和发现 服务调用和负载均衡 分布式事务 服务熔断和降级 服务链路追踪 服务网关 分布式配置管理 三、客户端版本 一、前置环境版本介绍 使用Cloud的版本决定Boot的版本&#xff0c;SpringCloud的…

【C语言】分支和循环(上)

【C语言】分支和循环&#xff08;上&#xff09; 1、if语句1.2 else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题 2、关系操作符3、条件操作符4、逻辑操作符&#xff1a;与、或、非&#xff08;取反&#xff09;&#xff08;&&&#xff0c;||&#xff0c;&#xff0…

从零开始学AI绘画,万字Stable Diffusion终极教程(五)

【第5期】ControlNet 欢迎来到SD的终极教程&#xff0c;这是我们的第五节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在SD里面&#xff0c;想要…

Mysql复习笔记: 基础概念(待补充)

一. 基础概念 通用概念: 网络连接必须得分配给一个线程去进行处理&#xff0c;由一个线程来监听请求以及读取请求数据&#xff0c;比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句 在数据库中&#xff0c;哪怕执行一条SQL语句&#xff0c;其实也可以是一个独立…

FLIR LEPTON3.5 热像仪wifi 科研实验测温采集仪

点击查看详情!点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情 1、描述 这是一款桌面科研实验测温热成像多功能热像记录仪&#xff0c;小巧轻便…

【C/C++】

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

## 01深度学习介绍与安装PyTorch

文章目录 深度学习的发展历史和基本概念早期历史兴起与发展基本概念 如何安装和设置PyTorch环境系统要求安装步骤验证安装 结语 深度学习的发展历史和基本概念 深度学习&#xff0c;一种通过使用具有多层结构的神经网络来学习数据的复杂模型的机器学习技术&#xff0c;近年来已…

Scikit是什么?

目录 一、Scikit是什么&#xff1f; 二、用Scikit做一个简单房价预测例子 三、sklearn知识点 一、Scikit是什么&#xff1f; Scikit就是scikit-learn&#xff0c;是一个免费软件机器学习库。 https://scikit-learn.org/stable/https://scikit-learn.org/stable/ 用于预测数…

ubuntu20配置深度学习环境

目录 系统环境安装anaconda文件的安装anaconda环境配置anaconda换中科大源常用的anaconda命令 安装显卡驱动安装CUDA下载cudnn安装pytorch更换conda源选择对应的pytorch版本进行安装 系统环境 ubuntu20&#xff0c;安装了ros noetic。 参考博客主要有&#xff1a; https://g…