当前位置: 首页 > news >正文

【使用Flask构建RESTful API】从零开始开发简单的Web服务!

使用Flask构建RESTful API:从零开始开发简单的Web服务

引言

随着Web应用程序的广泛使用,RESTful API已成为现代Web服务的核心技术之一。通过RESTful API,我们可以轻松地创建、读取、更新和删除(CRUD)数据,并与前端应用程序、移动客户端以及其他服务进行数据交互。Flask是一个轻量级的Python Web框架,非常适合构建简单的RESTful API。本篇博客将带你从零开始,使用Flask构建一个简单的RESTful API。

1. 什么是RESTful API?

REST(Representational State Transfer)是一种设计Web服务的架构风格,RESTful API是基于REST原则的API设计模式。RESTful API通过HTTP协议来传输数据,使用常见的HTTP方法,如:

  • GET:获取资源
  • POST:创建资源
  • PUT:更新资源
  • DELETE:删除资源

每个资源(如用户、文章、商品等)都通过URL进行标识,客户端通过这些URL进行CRUD操作。

2. Flask简介

Flask是一个微型Web框架,它的设计哲学是简单、灵活、易于扩展,非常适合用来构建小型Web应用或API。Flask遵循Pythonic的编程理念,让开发者能以少量代码实现功能。

Flask的特点:

  • 轻量级:只有核心功能,不强制使用任何数据库或模板引擎。
  • 灵活性:开发者可以自由选择和扩展功能。
  • 可扩展性强:通过第三方扩展库,可以快速添加功能。

3. 环境准备

在开始开发之前,首先我们需要安装Flask。你可以通过pip命令来安装Flask。

pip install Flask

安装完成后,便可以开始构建我们的RESTful API了。

4. 创建Flask应用

创建一个新的项目目录,并在其中创建一个Python文件(例如app.py)。我们首先要定义一个简单的Flask应用,并设置基本的路由。

from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')
def home():return jsonify({"message": "Welcome to the Flask RESTful API!"})if __name__ == "__main__":app.run(debug=True)

在上面的代码中,我们定义了一个基本的Flask应用,并设置了一个根路径的路由。当用户访问根URL时,API会返回一个JSON格式的欢迎消息。通过运行python app.py,你可以启动Flask服务器,默认监听http://127.0.0.1:5000/

5. 定义数据模型

为了让API更有实际意义,我们将创建一个简单的“任务管理系统”。每个任务都有以下属性:

  • id:任务的唯一标识符
  • title:任务的标题
  • description:任务的描述
  • done:任务是否完成

我们可以用一个Python列表来存储这些任务:

tasks = [{'id': 1,'title': 'Learn Flask','description': 'Learn how to build RESTful APIs using Flask.','done': False},{'id': 2,'title': 'Build an API','description': 'Create a simple API using Flask for task management.','done': False}
]

6. 实现GET请求

接下来,我们实现API的第一个功能:通过GET请求获取任务列表。我们可以定义一个新的路由来返回所有任务的数据。

@app.route('/tasks', methods=['GET'])
def get_tasks():return jsonify({'tasks': tasks})

当客户端访问/tasks时,API会返回任务列表的JSON格式数据。

通过任务ID获取单个任务

有时,我们需要通过任务的ID来获取特定的任务。我们可以定义一个带参数的路由来实现这一功能。

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):task = next((task for task in tasks if task['id'] == task_id), None)if task is None:return jsonify({'error': 'Task not found'}), 404return jsonify({'task': task})

在这里,/tasks/<int:task_id>路由接受任务ID作为参数,并通过ID在任务列表中查找对应的任务。如果找不到任务,API会返回404错误。

7. 实现POST请求

要通过API创建新任务,我们使用HTTP的POST方法。首先,我们需要导入request模块,以便能够从客户端接收数据。

from flask import request

接着,我们为API添加创建新任务的功能。

@app.route('/tasks', methods=['POST'])
def create_task():if not request.json or not 'title' in request.json:return jsonify({'error': 'The title is required'}), 400new_task = {'id': tasks[-1]['id'] + 1,'title': request.json['title'],'description': request.json.get('description', ""),'done': False}tasks.append(new_task)return jsonify({'task': new_task}), 201

在这个路由中,我们检查请求的数据是否为JSON格式,并确保提供了title字段。如果数据有效,我们创建一个新的任务,并将其添加到任务列表中。然后返回创建的任务及其状态码201(表示已创建)。

8. 实现PUT请求

通过PUT请求,我们可以更新现有任务的内容。我们首先查找需要更新的任务,然后根据客户端发送的数据更新任务的属性。

@app.route('/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):task = next((task for task in tasks if task['id'] == task_id), None)if task is None:return jsonify({'error': 'Task not found'}), 404if not request.json:return jsonify({'error': 'Request body must be JSON'}), 400if 'title' in request.json and not isinstance(request.json['title'], str):return jsonify({'error': 'Title must be a string'}), 400task['title'] = request.json.get('title', task['title'])task['description'] = request.json.get('description', task['description'])task['done'] = request.json.get('done', task['done'])return jsonify({'task': task})

这个PUT路由接收任务ID和更新的数据,对任务进行相应修改。我们还对传入数据进行了基本的验证。

9. 实现DELETE请求

最后,我们通过DELETE请求来删除任务。API会通过任务ID来查找并删除指定的任务。

@app.route('/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):task = next((task for task in tasks if task['id'] == task_id), None)if task is None:return jsonify({'error': 'Task not found'}), 404tasks.remove(task)return jsonify({'result': True})

当客户端发出DELETE请求时,API会删除匹配ID的任务,并返回删除操作是否成功的结果。

10. 测试API

到目前为止,我们已经实现了基本的CRUD功能。你可以通过各种HTTP请求方法来测试API。例如:

  • 获取所有任务GET /tasks
  • 获取单个任务GET /tasks/1
  • 创建新任务POST /tasks
  • 更新任务PUT /tasks/1
  • 删除任务DELETE /tasks/1

可以使用工具如curlPostman来发送这些请求并测试API的功能。

# 使用curl命令获取所有任务
curl http://127.0.0.1:5000/tasks

总结

本文详细介绍了如何使用Flask从零开始构建一个RESTful API。在此过程中,我们实现了任务管理系统的CRUD功能,并通过Flask提供了灵活的路由和简单的JSON响应。Flask框架轻量而强大,非常适合构建简单的API。希望通过本文,你能掌握Flask开发RESTful API的基本技能,并能够在实际项目中应用。

Flask的灵活性使得它非常适合小型项目和快速原型开发。如果你需要构建更加复杂的API或大型系统,可以考虑结合Flask的扩展(如Flask-SQLAlchemy)来实现更高级的功能。

相关文章:

【使用Flask构建RESTful API】从零开始开发简单的Web服务!

使用Flask构建RESTful API&#xff1a;从零开始开发简单的Web服务 引言 随着Web应用程序的广泛使用&#xff0c;RESTful API已成为现代Web服务的核心技术之一。通过RESTful API&#xff0c;我们可以轻松地创建、读取、更新和删除&#xff08;CRUD&#xff09;数据&#xff0c…...

用sdcc给51单片机编译C程序

学习单片机大部分人用的是Keil uVision&#xff0c;虽然好用&#xff0c;可大部分人用的是盗版&#xff0c;其实单片机程序小的话&#xff0c;完全可以用文本编辑器&#xff08;推荐notepad)编写&#xff0c;然后用免费的sdcc来编译&#xff0c;下面介绍一下大致的过程。 sdcc…...

Java Lock LockSupport 源码

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & LockSupport & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & LockSupport & 总结》&#xff08;学习总结/最新…...

Elasticsearch基础操作入门

阅前准备知识 学习 Elasticsearch (简称 ES) 的查询方式&#xff0c;建议从以下几个步骤入手&#xff1a; 理解 Elasticsearch 的基础概念 首先要了解 Elasticsearch 的核心概念&#xff0c;例如&#xff1a; Index&#xff08;索引&#xff09;&#xff1a;相当于数据库中…...

跨域问题解决办法

跨域问题在Web开发中是一个常见的问题&#xff0c;特别是在前后端分离的开发模式下。以下是一些解决跨域问题的办法&#xff1a; 一、后端配置CORS&#xff08;跨来源资源共享&#xff09; CORS是一种机制&#xff0c;它使用额外的HTTP头来告诉浏览器一个网页的当前来源&…...

【数据结构与算法】力扣 23. 合并 K 个升序链表

题干描述 23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a; lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a; [1,1,2,3,4,4,5,6]…...

Java Lock CountDownLatch 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & CountDownLatch & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & CountDownLatch & 总结》&#xff08;学习总…...

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…...

针对初学者的PyTorch项目推荐

文章目录 1. MNIST手写数字识别2. CIFAR-10图像分类3. 图像风格迁移4. 文本生成&#xff08;使用RNN&#xff09;5. 简单的问答系统6. 简单的生成对抗网络&#xff08;GAN&#xff09;7. 简单的推荐系统 对于初学者来说&#xff0c;选择一些简单且具有教育意义的项目来实践PyTo…...

Helm Chart文件介绍

介绍&#xff08;这个还没有完善 &#xff0c;目前在找工作呢&#xff09; Helm是Kubernetes的包管理器&#xff0c;类似于Ubuntu中的apt、CentOS中的yum或Python中的pip&#xff0c;可以快速查找、下载和安装软件包。Helm主要由客户端组件helm和服务端组件Tiller组成&#xf…...

1Panel 是新一代的 Linux 服务器运维管理面板

1Panel 是一款新一代的 Linux 服务器运维管理面板&#xff0c;旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服务器。它集成了主机监控、文件管理、数据库管理、容器管理等功能&#xff0c;并且支持多语言和国际化&#xff0c;包括英语、中文(繁体)和日语。以下是 1Panel …...

Qml-ShaderEffect的使用

Qml-ShaderEffect的使用 ShaderEffect的概述 ShaderEffect使用自定义的顶点和片段着色器用于渲染一个矩形。用于在qml场景中添加阴影、模糊、着色和页面卷曲等效果。 Qt5和Qt6中ShaderEffect有一定区别&#xff0c;在Qt6中由于支持不同的渲染API&#xff0c;ShaderEffect是用…...

鸿蒙next之axios二次封装并携带cookie

由于官方提供的ohos.net.http模块&#xff0c;直接使用不是很灵活&#xff0c;就引入了第三方ohos/axios库。 以下是引入axios并进行二次封装的步骤&#xff1a; 1、DevEco Studio打开终端输入命令安装插件 ohpm install ohos/axios 2、新建RequestUtil.ets import { JSON, …...

WordPress中最值得推荐的AI插件:专家级指南

WordPress平台上&#xff0c;人工智能&#xff08;AI&#xff09;技术不断发展&#xff0c;为用户提供了丰富的工具和功能。对于有经验的用户&#xff0c;这些工具不仅能提升网站性能和用户体验&#xff0c;还能在安全和互动方面提供更多支持。在这篇文章中&#xff0c;我将为大…...

HTTP介绍及请求过程

HTTP(HyperText Transfer Protocol),即超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。以下是关于 HTTP 的详细介绍: 一、基本概念 定义与作用: HTTP 是互联网上应用最为广泛的一种网络协议,它定义了客户端和服务器之间请求和响应的标准方式。…...

WebGL进阶(五)-可视域

理论基础&#xff1a; 顶点着色器 Vertex Shader 主要是负责处理顶点位置、顶点颜色、顶点向量等顶点的数据&#xff1b;处理一些顶点的变换&#xff1a;例如在进行视图变换和投影变换时MVP矩阵会改变顶点的位置信息。 输入&#xff1a; 顶点着色器输入部分主要是声明&…...

2024性价比家居好物有哪些?推荐五款值得每个家庭拥有的好物品牌!

每年双11的时候我都特别喜欢买一些家居好物&#xff0c;今年双11也不例外&#xff0c;经过我一两周的精心挑选&#xff0c;专门选了五款性价比高的家居好物&#xff0c;接下来给大家分享一下&#xff01; 家居好物一、希亦ACE Pro内衣洗衣机 我买过、评测过的内衣洗衣机&#…...

字节青训-查找热点数据问题

问题描述 给你一个整数数组 nums 和一个整数 k&#xff0c;请你返回其中出现频率前 k 高的元素。请按升序排列。 1 < nums.length < 10^5k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一&#xff0c;换句话说&#xff0c;数组中前 k 个高频元素的集合…...

Codeforces Round 981 (Div. 3) (A~F)

文章目录 A. Sakurako and Kosuke思路code B. Sakurako and Water思路code C. Sakurakos Field Trip思路code D. Kousukes Assignment思路code E. Sakurako, Kosuke, and the Permutation思路code F. Kosukes Sloth思路code Codeforces Round 981 (Div. 3) A. Sakurako and Ko…...

shell脚本实例(4)while实现1+...+100,linux新增用户

while实现1到100求和 #!/bin/bash/ s0 i1 #-le小于等于 while [ $i -le 100 ] dos$[ $s$i ]i$[ $i1 ] done echo $s echo $i 执行结果如下 修改用户名密码脚本 #!/bin/bash/ #提示用户输入用户名 read -p "请输入用户名&#xff1a;"username useradd $username #提…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...