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

基于Tauri与Bun的本地多智能体AI助手YouClaw:架构、配置与实战

1. 项目概述&#xff1a;一个桌面端的多智能体AI助手运行时 最近在折腾AI智能体&#xff08;Agent&#xff09;的本地化部署和集成&#xff0c;发现了一个挺有意思的开源项目——YouClaw。简单来说&#xff0c;它是一个基于Tauri 2构建的桌面应用&#xff0c;核心是一个支持多…...

Taotoken API密钥的精细权限管理与操作审计日志在安全运维中的作用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken API密钥的精细权限管理与操作审计日志在安全运维中的作用 对于负责技术基础设施安全与合规的团队而言&#xff0c;引入新…...

Cadence 17.4导出Gerber文件保姆级避坑指南(附TMC2300电机驱动板实战)

Cadence 17.4导出Gerber文件保姆级避坑指南&#xff08;附TMC2300电机驱动板实战&#xff09; 第一次用Cadence Allegro 17.4导出Gerber文件的新手&#xff0c;大概率会在某个环节卡住——要么是钻孔文件莫名报错&#xff0c;要么是板厂反馈光绘层对不齐。这种挫败感我太熟悉了…...

如何在Blender中实现工程级精确建模:CAD_Sketcher完全指南 [特殊字符]

如何在Blender中实现工程级精确建模&#xff1a;CAD_Sketcher完全指南 &#x1f680; 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾经在Blender中尝试创建精确的机…...

毫米波ISAC系统设计与FPGA实现关键技术

1. 毫米波ISAC系统设计背景与核心挑战在车联网和自动驾驶场景中&#xff0c;毫米波技术因其大带宽特性同时满足了高精度环境感知与高速数据传输的双重需求。传统方案采用雷达与通信系统独立部署&#xff0c;导致硬件资源浪费和频谱效率低下。我们基于IEEE 802.11ad标准设计的雷…...

保姆级教程:用MPTool给瑞昱RTL8762CMF蓝牙芯片烧录固件(附串口接线图)

零基础实战&#xff1a;RTL8762CMF蓝牙芯片固件烧录全流程指南 拿到一块搭载RTL8762CMF的开发板时&#xff0c;最关键的步骤莫过于正确烧录固件。作为一款支持蓝牙5.0的低功耗芯片&#xff0c;RTL8762CMF在物联网设备中应用广泛。但很多开发者在首次接触时&#xff0c;往往会在…...

从零打造蒸汽朋克辉光管时钟:驱动方案、定制管与系统集成实战

1. 项目概述&#xff1a;从零开始的蒸汽朋克辉光管时钟作为一个在电子制作和复古硬件领域折腾了十多年的老玩家&#xff0c;我始终对那些散发着温暖橘红色光芒的辉光管&#xff08;Nixie Tube&#xff09;情有独钟。它们不仅仅是时间的显示器&#xff0c;更像是一件连接过去与未…...

巧用历史版本溯源法,化解R包依赖链安装难题

1. 为什么R包安装总是报错&#xff1f;从依赖链说起 每次看到RStudio里跳出一串红色报错信息&#xff0c;我就知道又要开始"解谜"了。特别是当你想装个ggplot2画个图&#xff0c;结果提示rlang版本不对&#xff1b;升级rlang后又发现pillar不兼容...这种连环套问题&a…...

从零搭建知识图谱:我是如何用Neo4j和neosemantics处理Wikidata RDF数据的

从零搭建知识图谱&#xff1a;我是如何用Neo4j和neosemantics处理Wikidata RDF数据的 第一次接触Wikidata的RDF数据时&#xff0c;我被它庞大的规模和复杂的结构震撼到了。作为一个长期从事数据科学工作的研究者&#xff0c;我深知将这些半结构化数据转化为可操作的知识图谱需要…...

Hotkey Detective:Windows快捷键冲突终极解决方案,3分钟快速定位占用程序

Hotkey Detective&#xff1a;Windows快捷键冲突终极解决方案&#xff0c;3分钟快速定位占用程序 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/h…...