【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数
本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧!
前言
当小菜踏入Flask后端开发的世界时,深刻理解路由和视图函数的作用至关重要。它们是Flask应用中的核心组件,用于处理URL请求和生成响应。
本文将为你清晰地解释如何在Flask中巧妙地使用路由和视图函数来构建API。我们将从基础开始,详细介绍路由的定义、参数传递、HTTP方法的使用,以及如何通过视图函数来生成响应。通过实际的代码示例,读者朋友们将掌握如何创建灵活的API端点,以满足不同请求的需求。
注意:本文叙述的比较详细(即比较啰嗦),但都是干货
路由与视图函数
在Flask 中,路由(Routes)是指将URL映射到特定的处理函数,这些处理函数通常被称为视图函数(View Functions)。
Flask中的路由和视图函数是构建Web应用的核心。
- 路由决定了当用户访问特定的URL时,应该执行哪个视图函数来处理请求。
- 路由将URL映射到相应的视图函数,视图函数处理用户请求并返回响应。
让我们通过实例深入了解这两个重要的概念。
路由 (Routes)
以下是使用表格形式整理的 Flask 路由规则类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| 静态路由规则 | 指定特定的 URL 路径与视图函数的关联 | @app.route('/hello') |
| 动态路由规则 | 允许定义动态部分,由尖括号 < > 包围,并作为参数传递给视图函数 | @app.route('/book/<book_id>') |
| int 类型转换器 | 指定整数类型的动态路由参数 | @app.route('/book/<int:book_id>') |
| float 类型转换器 | 指定浮点数类型的动态路由参数 | @app.route('/book/<float:book_id>') |
| path 类型转换器 | 匹配包括斜杠 / 在内的路径信息,并将整个路径作为参数传递给视图函数 | @app.route('/path/<path:subpath>') |
使用这些不同类型的路由规则,你可以更灵活地处理不同类型的 URL 请求,并将参数传递给相应的视图函数。
定义路由
在Flask中,路由使用@app.route()装饰器来定义。装饰器的参数是URL路径,指定了访问哪个路径时应该调用哪个视图函数。
from flask import Flaskapp = Flask(__name__)@app.route("/")
def home():return "Welcome to the Home Page!"@app.route("/about")
def about():return "This is the About Page."if __name__ == '__main__':app.run()
在这个示例中,我们定义了两个路由。
- 当用户访问根URL(“/”)时,
Flask将调用名为home的视图函数,返回欢迎页面。 - 当用户访问 “/about” 路径时,
Flask将调用名为about的视图函数,返回关于页面。
访问效果如下图所示:

动态路由
有一个书籍网站,在访问它时候,你会希望处理带有变量的URL,例如http://www.example.com/book/1234。
在Flask中,支持动态路由。我们可以在路由路径中使用尖括号<>来指示变量部分。
@app.route("/book/<book_id>")
def profile(book_id):return f"Hello, {book_id}!"
在这个例子中,我们定义了一个动态路由,即 /book/<book_id>。当用户访问像 “/book/1234” 这样的路径时,Flask 将调用名为 profile 的视图函数,并将 1234 作为参数传递给函数。
访问效果如下图所示:

路由中参数指定类型
指定传入参数的类型作用如下:
-
类型安全性: 通过指定参数类型,可以确保接收到的参数是符合预期的类型,这有助于防止在后续代码中出现类型错误。这提高了代码的健壮性和可维护性。
-
自动类型转换:
Flask使用类型转换器来自动将 URL 中的参数值转换为指定的类型。这简化了参数处理的过程,不必在视图函数中显式进行类型转换。 -
路由决策: 指定参数类型还有助于
Flask在多个路由规则之间进行正确的选择。例如,如果有两个路由规则,一个接受整数参数,另一个接受字符串参数,Flask可以根据传入的参数类型来决定使用哪个规则,从而确保正确的路由。 -
错误处理: 如果传入的参数无法转换为指定的类型,
Flask可以在内部处理这种错误情况并返回适当的错误响应。这比让应用程序抛出异常更加友好,可以向客户端提供有意义的错误信息。
总的来说,指定传入参数的类型有助于提高代码的可读性、可维护性和安全性,并简化了参数处理和路由选择过程。
进一步的,我们可以为动态路由指定类型,
只需要在 book_id 前面添加 int: 即可
@app.route("/book/<int:book_id>")
def profile(book_id):return f"Hello, {book_id}!"
效果和动态路由中一致,
但如果传入的参数不是int类型,与指定的类型不匹配,Flask 将会抛出 404 错误(Not Found)。这意味着 Flask 无法找到匹配的路由规则,因为参数类型不符合要求。
- 关于错误的处理,在后面的文章中会进行介绍。
访问效果如下图所示:

视图函数 (View Functions)
视图函数是处理特定URL请求的关键组件。它们负责执行请求的处理逻辑,并返回适当的数据或响应。
返回值
在视图函数中,必须需要有返回值,若不带返回值,则抛出一个 TypeError错误:
TypeError: The view function for 'function' did not return a valid response. The function either returned None or ended without a return statement.
返回类型必须是字符串、dict、列表、具有标头或状态的元组、响应实例或可调用的WSGI。
如果返回值类型不符合,则抛出一个 TypeError错误 :
TypeError: The view function did not return a valid response. The return type must be a string, dict, list, tuple with headers or status, Response instance, or WSGI callable, but it was a int.
编写视图函数
在下一篇文章中,会对这一 part 做详细的介绍。
在Flask中,编写视图函数非常简单。只需定义一个Python函数,使用@app.route()装饰器将其与特定URL关联起来。
然后,在函数内部实现处理逻辑,并返回相应的数据。
@app.route("/about")
def about():return "This is the About Page."
在这个例子中,about函数通过@app.route("/about")装饰器与路径/about关联。当用户访问该路径时,hello函数会被调用,返回字符串 “This is the About Page.” 作为响应。
总结
本文清晰地解释了如何使用路由和视图函数构建API,包括路由的定义、参数传递、多种HTTP方法的使用,以及视图函数的返回值类型。通过实际代码示例,小菜已经学会创建灵活的API端点,以满足不同请求的需求。
- 路由用于将URL映射到特定的视图函数,决定了哪个函数应该处理用户的请求;
- 视图函数负责处理请求,并返回适当的响应;
- 动态路由允许处理带有变量的URL;
- 指定路由中参数类型;
- 基础视图函数如何编写;
小菜现在已经可以根据需要定义不同的路由,通过合理的路由和视图函数的设计,以及编写相应的视图函数来处理用户请求,从而构建出更加复杂、灵活的Web应用。
相关文章:
【实战Flask API项目指南】之三 路由和视图函数
实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发的世界时&…...
mediasoup udp端口分配策略
mediasoup-worker多进程启动时,rtcMinPort/rtcMaxPort可以使用相同的配置。 for (let i 0; i < numWorkers; i) { let worker await mediasoup.createWorker({ logLevel: config.mediasoup.worker.logLevel, logTags: config.mediasoup.work…...
山西电力市场日前价格预测【2023-11-07】
日前价格预测 预测说明: 如上图所示,预测明日(2023-11-07)山西电力市场全天平均日前电价为318.54元/MWh。其中,最高日前电价为514.01元/MWh,预计出现在18: 00。最低日前电价为192.95元/MWh,预计…...
Microsoft Dynamics 365 CE 扩展定制 - 5. 外部集成
本章内容包括: 使用.NET从其他系统连接到Dynamics 365使用OData(Java)从其他系统连接到Dynamics 365使用外部库从外部源检索数据使用web应用程序连接到Dynamics 365运行Azure计划任务设置Azure Service Bus终结点与Azure Service Bus构建近乎实时的集成使用来自Azure服务总线…...
手机升级STM32单片机,pad下载程序,手机固件升级单片机,局域网程序下载,STM32单片机远程下载升级
STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写…...
【漏洞复现】weblogic-SSRF漏洞
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 漏洞测试注入HTTP头,利用Redis反弹shell 问题解决 Path : vulhub/weblogic/ssrf 编译及启动测试环境 docker compose up -dWeblogic中存在一个SSRF漏洞࿰…...
FreeSWTCH dialplan check nosdp
应朋友要求写一段dialplan,如果没有sdp(sip_profile打开了3pcc),马上回486,当然如果有sdp,dialplan正常往下走 我试了试,貌似不太复杂,如下: <!-- check no sdp --&…...
微信小程序案例3-1 比较数字
文章目录 一、运行效果二、知识储备(一)Page()函数(二)数据绑定(三)事件绑定(四)事件对象(五)this关键字(六)setData()方法࿰…...
哈希表----数据结构
引入 如果你是一个队伍的队长,现在有 24 个队员,需要将他们分成 6 组,你会怎么分?其实有一种方法是让所有人排成一排,然后从队头开始报数,报的数字就是编号。当所有人都报完数后,这 24 人也被分…...
可达矩阵-邻接矩阵-以及有向图的python绘制
参考1 自定义输入矩阵来绘制 根据参考代码, 自定义 代码如下: # 编程实现有向图连通性的判断 from pylab import mplmpl.rcParams[font.sans-serif] [SimHei] mpl.rcParams[axes.unicode_minus] False import numpy as np import networkx as nx imp…...
react typescript @别名的使用
1、config/webpack.config.js中找到alias,添加: path.resolve(src) ,如下: alias: {// Support React Native Web// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/"react-native&qu…...
C++性能优化笔记-6-C++元素的效率差异-7-类型转换
C元素的效率差异 类型转换signed与unsigned转换整数大小转换浮点精度转换整数到浮点转换浮点到整数转换指针类型转换重新解释对象的类型const_caststatic_castreinterpret_castdynamic_cast转换类对象 类型转换 在C语法中,有几种方式进行类型转换: // …...
c#中switch常用模式
声明模式 首先检查value的类型,然后根据类型输出相应的消息 public void ShowMessage(object value) {switch (value){case int i: Console.WriteLine($"value is int:{i}"); break;case long l: Console.WriteLine($"value is long:{l}"); b…...
Flink SQL 常用作业sql
目录 flink sql常用配置kafka source to mysql sink窗口函数 开窗datagen 自动生成数据表tumble 滚动窗口hop 滑动窗口cumulate 累积窗口 grouping sets 多维分析over 函数TopN flink sql常用配置 设置输出结果格式 SET sql-client.execution.result-modetableau;kafka source…...
nodejs国内镜像及切换版本工具nvm
淘宝 NPM 镜像站(http://npm.taobao.org)已更换域名,新域名: Web 站点:https://npmmirror.com Registry Endpoint:https://registry.npmmirror.com 详见: 【望周知】淘宝 NPM 镜像换域名了&…...
用Rust和Scraper库编写图像爬虫的建议
本文提供一些有关如何使用Rust和Scraper库编写图像爬虫的一般建议: 1、首先,你需要安装Rust和Scraper库。你可以通过Rustup或Cargo来安装Rust,然后使用Cargo来安装Scraper库。 2、然后,你可以使用Scraper库的Crawler类来创建一个…...
Java 语言环境搭建
JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境,即编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前,首先要到 Oracle 网站获取 JDK 安装包。JDK 安装包被集成在 Java SE 中&a…...
酷开科技 | 酷开系统里萌萌哒小维在等你!
在一片金黄淡绿的颜色中,深秋的脚步更近了,在这个气候微凉的季节里,你是不是更想拥有一种温暖的陪伴呢?酷开科技智慧AI语音功能更懂你,贴心的小维用心陪伴你的每一天。 01.全天候陪伴 在酷开系统中,只要你…...
Bash 4关联数组:错误“声明:-A:无效选项”
Bash 4 associative arrays: error “declare: -A: invalid option” 就是bash版本太低 1.先确定现在的版本 bash -version 我的就是版本太低 升级新版本bash4.2 即可 升级步骤 1.下载bash-4.2wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz 2. 下载完成解压 tar -zxvf…...
干货|AI辅助完成论文的正确打开方式!
论文写作中可能遇到问题 1. 选题问题:是否无法确定研究方向和选择合适的题目? 2. 文献综述问题:是否困惑如何进行文献调研和综述? 3. 方法论问题:是否不知道该选择何种研究方法? 4. 数据处理问题&#…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
