【实战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 Flask

app = 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 作为参数传递给函数。

访问效果如下图所示

路由中参数指定类型

指定传入参数的类型作用如下:

  1. 类型安全性: 通过指定参数类型,可以确保接收到的参数是符合预期的类型,这有助于防止在后续代码中出现类型错误。这提高了代码的健壮性和可维护性。

  2. 自动类型转换: Flask 使用类型转换器来自动将 URL 中的参数值转换为指定的类型。这简化了参数处理的过程,不必在视图函数中显式进行类型转换。

  3. 路由决策: 指定参数类型还有助于 Flask 在多个路由规则之间进行正确的选择。例如,如果有两个路由规则,一个接受整数参数,另一个接受字符串参数,Flask 可以根据传入的参数类型来决定使用哪个规则,从而确保正确的路由。

  4. 错误处理: 如果传入的参数无法转换为指定的类型,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应用。

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

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

相关文章

倒计时丨3天后,我们直播间见!

倒计时3天&#xff0c;RestCloud 零代码集成自动化平台重磅发布 ⏰11 月 9 日 14:00&#xff0c;期待您的参与&#xff01; 点击报名&#xff1a;http://c.nxw.so/dfaJ9

【LeetCode周赛】LeetCode第370场周赛

目录 找到冠军 I找到冠军 II在树上执行操作以后得到的最大分数平衡子序列的最大和 找到冠军 I 一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 < i, j < n - 1 且 i ! j 的所有 i, …

Unit1_3:分治算法之排序问题

文章目录 一、归并排序二、快速排序思路伪代码流程图时间复杂度改进 三、堆排序结构插入提取最小值排序抽象 四、比较排序总结决策树模型 一、归并排序 归并排序子操作的思路和Unit1_2逆序计算一样 下面写一下伪代码 if left < right thencenter←L(left right)/2];Merge…

(1)(1.12) LeddarTech LeddarVu8

文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 LeddarTech LeddarVu8 是一款长距离&#xff08;185m&#xff09;激光雷达&#xff0c;可在 16 度至 99 度视场范围内提供 8 个单独的距离&#xff0c;具体取决于所使用的型号。ArduPilot 始终使用所提供的 8 个距离中最…

C++编程案例讲解-基于结构体的控制台通讯录管理系统

基于结构体的控制台通讯录管理系统 通讯录是一个可以记录亲人、好友信息的工具&#xff0c;系统中需要实现的功能如下&#xff1a; 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人…

APP开发:用途与未来前景|软件定制开发|网站小程序建设

APP开发&#xff1a;用途与未来前景|软件定制开发|网站小程序建设 APP开发已成为现代科技趋势的一部分&#xff0c;无论是日常生活还是商业领域&#xff0c;都有它的身影。通过开发APP&#xff0c;我们可以将想法、功能和内容转化为直观、易用的移动设备应用程序&#xff0c;满…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

如何防范AI诈骗

如何防范AI诈骗 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1f604; ✨座右铭&#…

AMEYA360荣获“国际潜力之星分销商”奖!

由全球电子技术领域知名媒体集团ASPENCORE主办的“全球电子元器件分销商卓越表现奖"颁奖典礼于2023年11月3日晚在深圳大中华喜来登酒店圆满结束! 全球电子元器件分销商卓越表现奖创办于2001 年&#xff0c;迄今已成功举办20年&#xff0c;此奖项旨在表彰支持电子产业发展的…

Linux下yum源配置实战

一、Linux下软件包的管理 1、软件安装方式 ① RPM包管理&#xff08;需要单独解决依赖问题&#xff09; ② YUM包管理&#xff08;需要有网络及YUM仓库的支持&#xff0c;会自动从互联网下载软件&#xff0c;自动解决依赖&#xff09; ③ 源码安装&#xff08;安装过程比较…

【已解决】设置SSH主机:VS Code-正在本地下载 VS Code 服务器

问题描述 很简单&#xff0c;就是我电脑强制重启之后用vscode再去连服务器&#xff0c;发现连不上了 解决办法 如上图&#xff0c;点击重试按钮&#xff0c;下面的这些东西就可以复制粘贴了 ctrf查找commit&#xff0c;这个时候就能找到一串d037ac076cee195194f93ce6fe2bdfe296…

Qt的事件

2023年11月5日&#xff0c;周日上午 还没写完&#xff0c;不定期更新 目录 事件处理函数的字体特点Qt事件处理的工作原理一些常用的事件处理函数Qt中的事件类型QEvent类的type成员函数可以用来判断事件的类型事件的类型有哪些&#xff1f;有多少种事件类 事件处理函数的字体特…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录&#xff0c;包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

vue2.0 打包,nginx部署

1、修改这里为空 否则报错&#xff1a;vue is undefined 2、修改为hash&#xff0c;重点&#xff1a;打包dist文件运行&#xff0c;必须这样 3、安装ngnix&#xff0c;重点&#xff1a;使用node的包&#xff1a;httpserve&#xff0c;失败 4、重点&#xff1a;配置代理转发 前端…

Python中最常用的10个内置函数!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python作为一种多用途编程语言&#xff0c;拥有丰富的内置函数库&#xff0c;这些函数可以极大地提高开发效率。本文将介绍Python中最常用的10个内置函数&#xff0c;它们的功能各有不同&#xff0c;但在实际编程…

Python 海龟绘图基础教学教案(一)

Python 海龟绘图——第 1 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 考察 turtle 基本命令&#xff0c;绘制直线&#xff0c;使用 forward&#xff0c;可缩写为 fd。 答案&#xff1a; import turtle as t t.fd(100) # 或者使用 t.forward(100) t.done() Python 海…

linux+python3.6.8+uwsgi+postgresql+django部署web服务器

linuxpython3.6.8uwsgipostgresqldjango部署web服务器 1.查看系统信息2.配置postgresql数据库2-1.安装postgresql数据库2-2.设置密码2-3.修改postgresql数据库配置文件 3.Python虚拟环境激活虚拟环境 4.Django4-1.Python 安装Django4-2.创建Django项目4-3.配置Django 5.uwsgi5-…

管道的介绍

管道 它是一个连接读写进程的文件&#xff0c;用户进程间数据交互和进程同步造作。管道是单向的&#xff0c;发送进程视管道为输出文件&#xff0c;将大量数据以字节流的形式送入管道&#xff1b;接收进程视管道为输入文件&#xff0c;接收管道的数据。 管道优缺点 1、管道…

Educational Codeforces Round 157 (Rated for Div. 2) D. XOR Construction (思维题)

题目 给定长为n-1(n<2e5)的整数序列a&#xff0c;第i个数a[i](0<a[i]<2n) 构造一个长为n的整数序列b&#xff0c;满足&#xff1a; 1. 0到n-1在b数组中每个数恰好出现一次 2. 对于&#xff0c; 题目保证一定有解&#xff0c;有多组时可以输出任意一组 思路来源 …

如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?

「十项全能」的 ChatGPT &#xff0c;用起来感受如何&#xff1f; 之前&#xff0c;作为 ChatGPT Plus 用户&#xff0c;如果你集齐下面这五个模式&#xff0c;就会成为别人羡慕的对象。 但现在&#xff0c;人们更加期盼的&#xff0c;是下面这个提示的出现&#xff1a; 这个提…