【实战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. 数据处理问题&#…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...
