当前位置: 首页 > 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 #提…...

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

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

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...