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

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...