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

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...