Flask-RESTful 分析

一只猴子在接线,背景是集成电路,整个场景采用了幽默卡通风格,色彩鲜艳

Flask-RESTful 是一个 Flask 扩展,它为构建 RESTful API 提供了方便的工具和资源。它简化了创建 RESTful 服务的过程,允许开发者专注于业务逻辑而不是 HTTP 协议的细节。

  1. 资源(Resources)
    • Resource 类:是 Flask-RESTful 的核心,它代表一个 RESTful 资源。开发者可以通过继承 Resource 类并定义 HTTP 方法(如 get, post, put, delete 等)来创建资源。
    • 方法装饰器:可以使用 @marshal_with 装饰器来序列化输出数据,使用 @expect 装饰器来声明期望的输入数据。
  2. 字段(Fields)和_marshall_with
    • 字段:是 Flask-RESTful 中的一个重要概念,用于定义如何将 Python 对象转换为 JSON。Field 类及其子类(如 StringField, IntegerField 等)用于描述和格式化输出。
    • marshal_with:是一个装饰器,用于指定一个字段列表(称为_marshallSchema),它定义了如何将资源方法返回的数据转换为 JSON。
  3. 请求解析(Request Parsing)
    • Flask-RESTful 提供了请求解析功能,允许开发者定义输入数据的格式和类型。使用 reqparse.RequestParser 类,可以添加参数并指定参数类型、默认值、位置(如 JSON, 表单等)和其他验证器。
  4. API
    • Api 类:是 Flask-RESTful 应用的入口点。它管理资源与 URL 的映射,并处理请求的分发。使用 Api 实例的 add_resource 方法可以将资源添加到应用中。
  5. 异常处理(Error Handling)
    • Flask-RESTful 允许开发者定义自定义异常和错误处理逻辑。可以通过继承 restful.Api 类并重写 handle_error 方法来实现自定义错误处理。
  6. 认证(Authentication)
    • Flask-RESTful 可以与 Flask 的认证扩展(如 Flask-Login)一起使用,以保护 API 并验证用户身份。
  7. API 版本控制
    • Flask-RESTful 支持通过蓝图和子域来实现 API 的版本控制。
  8. 完整性和性能
    • Flask-RESTful 提供了数据完整性的保证,确保客户端接收到的数据是完整和一致的。同时,它也考虑了性能优化,如使用缓存来提高响应速度。
      Flask-RESTful 的目标是提供一个简单的框架,让开发者能够以最少的工作量创建出符合 REST 架构风格的 Web 服务。通过利用 Flask 的简洁性和 Flask-RESTful 的强大功能,开发者可以快速构建出高效、可靠的 API。

最小API

# 导入 Flask 和 Flask-RESTful 的相关类
from flask import Flask
from flask_restful import Resource, Api
# 创建 Flask 应用实例
app = Flask(__name__)
# 创建 Flask-RESTful API 实例
api = Api(app)
# 定义一个名为 HelloWorld 的资源类,继承自 flask_restful.Resource
class HelloWorld(Resource):# 定义 GET 方法,当客户端发送 GET 请求时会调用这个方法def get(self):# 返回一个字典,其中包含一个键值对 'hello': 'world'return {'hello': 'world'}
# 将 HelloWorld 资源添加到 API 路由中,设置其 URL 为 '/'
api.add_resource(HelloWorld, '/')
# 当此脚本作为主程序运行时(而不是被导入时),执行以下代码
if __name__ == '__main__':# 启动 Flask 应用,开启 debug 模式以提供调试信息app.run(debug=True)

这段代码创建了一个基本的 Flask 应用,并使用 Flask-RESTful 扩展添加了一个简单的 RESTful API。当你在浏览器或使用工具(如 curl)访问服务器的根 URL(http://localhost:5000/)时,你会得到一个 JSON 响应 {"hello": "world"}

与资源交互

这段代码创建了一个简单的待办事项(Todo)管理应用,允许用户通过HTTP GET和PUT请求来检索和更新待办事项。

# 导入Flask和Flask-RESTful的相关类
from flask import Flask, request
from flask_restful import Resource, Api
# 创建Flask应用实例
app = Flask(__name__)
# 创建Flask-RESTful API实例
api = Api(app)
# 创建一个字典来存储待办事项,键为todo_id,值为待办事项的内容
todos = {}
# 定义一个名为TodoSimple的资源类,继承自flask_restful.Resource
class TodoSimple(Resource):# 定义GET方法,当客户端发送GET请求时会调用这个方法#(todo_id)表示这个方法是带参数的,参数名为todo_iddef get(self, todo_id):# 从todos字典中获取todo_id对应的待办事项,并返回# 如果todo_id不存在,会抛出一个KeyError异常return {todo_id: todos[todo_id]}# 定义PUT方法,当客户端发送PUT请求时会调用这个方法#(todo_id)表示这个方法是带参数的,参数名为todo_iddef put(self, todo_id):# 从请求的表单数据中获取'data'字段,并将其存储在todos字典中# todo_id作为键,request.form['data']作为值todos[todo_id] = request.form['data']# 返回更新后的待办事项return {todo_id: todos[todo_id]}
# 将TodoSimple资源添加到API路由中,设置其URL为'/<string:todo_id>'
# 这里的<string:todo_id>表示todo_id是一个字符串类型的参数
api.add_resource(TodoSimple, '/<string:todo_id>')
# 当此脚本作为主程序运行时(而不是被导入时),执行以下代码
if __name__ == '__main__':# 启动Flask应用,开启debug模式以提供调试信息app.run(debug=True)

这段代码定义了一个名为 TodoSimple 的资源,它有两个方法:getputget 方法用于检索指定 todo_id 的待办事项,而 put 方法用于创建或更新待办事项的内容。待办事项的数据存储在全局字典 todos 中。应用运行后,可以通过发送 HTTP 请求到 /todo_id 来与资源进行交互。

定义响应头

这段代码定义了三个Flask-RESTful资源类,每个类都只有一个GET方法,但它们在返回响应时有所不同。

# 导入Flask-RESTful的Resource类
from flask_restful import Resource
# 定义一个名为Todo1的资源类,继承自flask_restful.Resource
class Todo1(Resource):# 定义GET方法,当客户端发送GET请求时会调用这个方法def get(self):# 返回一个字典{'task': 'Hello world'},HTTP响应码默认为200 OKreturn {'task': 'Hello world'}
# 定义一个名为Todo2的资源类,继承自flask_restful.Resource
class Todo2(Resource):# 定义GET方法,当客户端发送GET请求时会调用这个方法def get(self):# 返回一个字典{'task': 'Hello world'},HTTP响应码设置为201 Createdreturn {'task': 'Hello world'}, 201
# 定义一个名为Todo3的资源类,继承自flask_restful.Resource
class Todo3(Resource):# 定义GET方法,当客户端发送GET请求时会调用这个方法def get(self):# 返回一个字典{'task': 'Hello world'},HTTP响应码设置为201 Created# 并添加自定义响应头{'Etag': 'some-opaque-string'}return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}

在这个例子中,每个类都代表一个可以访问的资源。Todo1 返回一个默认的200响应码,表示请求成功。Todo2 返回一个201响应码,通常用于创建资源的响应,表示请求已成功处理并创建了新的资源。Todo3 也返回一个201响应码,但同时还包括了一个自定义的响应头Etag,这通常用于缓存验证,表示资源的版本信息。
这些类可以添加到Flask-RESTful的API中,并通过相应的URL路径进行访问。每个类的get方法都可以通过HTTP GET请求来调用,返回一个 JSON 响应 {"hello": "world"}

参数验证

这段代码使用了 Flask-RESTful 的 reqparse 模块来解析请求参数。

# 导入 Flask-RESTful 的 reqparse 模块
from flask_restful import reqparse
# 创建一个 RequestParser 实例,用于解析请求中的参数
parser = reqparse.RequestParser()
# 使用 add_argument 方法添加一个参数 'rate' 到解析器中
# 参数类型设置为 int,表示期望 'rate' 是一个整数
# help='Rate to charge for this resource' 提供了一个帮助信息,当参数验证失败时会显示这个信息
parser.add_argument('rate', type=int, help='Rate to charge for this resource')
# 调用 parse_args 方法来解析请求中的参数
# 如果请求中包含 'rate' 参数,它会将其转换为整数,并存储在 args 对象中
# 如果 'rate' 参数不存在或者不是整数,Flask-RESTful 会返回一个 400 Bad Request 响应,并显示帮助信息
args = parser.parse_args()
# 现在 args 对象包含了请求中的 'rate' 参数,可以直接使用 args['rate'] 来获取其值
# 调用 parse_args 方法来解析请求中的参数
# strict=True 参数指定了严格模式,只有预先在解析器中定义的参数会被接受
# 如果请求中包含未定义的参数,将抛出一个 BadRequest 异常,导致 400 Bad Request 响应
args = parser.parse_args(strict=True)

在这个例子中,parser 对象被用来定义期望从请求中解析出的参数。add_argument 方法用于指定参数的名称、类型和帮助信息。当 parse_args 方法被调用时,它会解析实际的请求,提取出 rate 参数,并将其转换为整数类型。如果解析过程中出现问题(例如,rate 参数不是整数),Flask-RESTful 会自动生成一个错误响应。

格式化数据

这段代码展示了如何使用 Flask-RESTful 的 marshal_with 装饰器和 fields 模块来格式化资源类的输出。

# 导入 Flask-RESTful 的 fields 和 marshal_with
from flask_restful import fields, marshal_with
# 定义一个字段映射,指定了资源返回的数据结构
# 'task' 字段将被格式化为字符串,'uri' 字段将被格式化为 URL
# 'uri' 字段的值 'todo_ep' 是一个 endpoint 名称,用于生成 URL
resource_fields = {'task':   fields.String,'uri':    fields.Url('todo_ep')
}
# 定义一个 TodoDao 类,代表待办事项的数据访问对象
class TodoDao(object):def __init__(self, todo_id, task):self.todo_id = todo_idself.task = task# 定义一个 'status' 属性,但注释指出这个字段不会包含在响应中self.status = 'active'
# 定义一个 Todo 资源类,继承自 flask_restful.Resource
class Todo(Resource):# 使用 marshal_with 装饰器,指定了返回值应该使用 resource_fields 来格式化@marshal_with(resource_fields)def get(self, **kwargs):# 创建一个 TodoDao 实例,并传入 todo_id 和 taskreturn TodoDao(todo_id='my_todo', task='Remember the milk')

在这个例子中,marshal_with 装饰器用于指定返回值的格式。resource_fields 字典定义了哪些字段应该包含在响应中,以及它们应该如何被格式化。fields.String 表示该字段应该被格式化为字符串,而 fields.Url 表示该字段应该被格式化为 URL,todo_ep 是一个 endpoint 名称,它将被用于生成实际的 URL。
TodoDao 类是一个简单的数据访问对象,它包含了 todo_idtaskstatus 属性。在 Todo 资源类的 get 方法中,创建了一个 TodoDao 实例,并返回它。由于 marshal_with 装饰器的使用,只有 taskuri 字段会被包含在最终的响应中,而 status 字段会被忽略。

完整示例

# 导入 Flask 和 Flask-RESTful 的相关类
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
# 创建 Flask 应用实例
app = Flask(__name__)
# 创建 Flask-RESTful API 实例
api = Api(app)
# 定义一个字典来存储待办事项,键为 todo_id,值为待办事项的内容
TODOS = {'todo1': {'task': 'build an API'},'todo2': {'task': '?????'},'todo3': {'task': 'profit!'},
}
# 定义一个函数来检查待办事项是否存在,如果不存在则抛出 404 错误
def abort_if_todo_doesnt_exist(todo_id):if todo_id not in TODOS:abort(404, message="Todo {} doesn't exist".format(todo_id))
# 创建一个 RequestParser 实例来解析请求中的参数
parser = reqparse.RequestParser()
parser.add_argument('task')
# 定义一个 Todo 资源类,继承自 flask_restful.Resource
class Todo(Resource):# 定义 GET 方法,用于获取指定 todo_id 的待办事项def get(self, todo_id):abort_if_todo_doesnt_exist(todo_id)return TODOS[todo_id]# 定义 DELETE 方法,用于删除指定 todo_id 的待办事项def delete(self, todo_id):abort_if_todo_doesnt_exist(todo_id)del TODOS[todo_id]return '', 204  # 返回空响应和 204 No Content 状态码# 定义 PUT 方法,用于更新指定 todo_id 的待办事项def put(self, todo_id):args = parser.parse_args()task = {'task': args['task']}TODOS[todo_id] = taskreturn task, 201  # 返回更新后的待办事项和 201 Created 状态码
# 定义一个 TodoList 资源类,继承自 flask_restful.Resource
class TodoList(Resource):# 定义 GET 方法,用于获取所有待办事项的列表def get(self):return TODOS# 定义 POST 方法,用于添加新的待办事项def post(self):args = parser.parse_args()todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1todo_id = 'todo%i' % todo_idTODOS[todo_id] = {'task': args['task']}return TODOS[todo_id], 201  # 返回新添加的待办事项和 201 Created 状态码
# 添加资源路由到 API
api.add_resource(TodoList, '/todos')  # 将 TodoList 资源映射到 /todos 路径
api.add_resource(Todo, '/todos/<todo_id>')  # 将 Todo 资源映射到 /todos/<todo_id> 路径
# 当此脚本作为主程序运行时,执行以下代码
if __name__ == '__main__':# 启动 Flask 应用,开启 debug 模式以提供调试信息app.run(debug=True)

这个应用定义了两个资源:TodoTodoListTodo 资源允许用户获取、删除和更新特定的待办事项,而 TodoList 资源允许用户获取所有待办事项的列表和添加新的待办事项。待办事项的数据存储在全局字典 TODOS 中。应用运行后,可以通过发送 HTTP 请求到指定的 URL 来与资源进行交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/298196.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[WinForm开源]原神混池模拟器-蒙德篇:软件的基本介绍、使用方法、常见问题解决与代码开源

首先先和各位旅行者道个歉&#xff0c;混池都过去这么久了才把软件开发好并发布出来 >_< 创作目的&#xff1a;为给各位旅行者&#xff08;当然包括我自己&#xff09;估测混池抽取的出货率以及让各位旅行者可以过手瘾&#xff0c;故开发了此项目作为参考。 创作说明&am…

java 常见API(Objects)

定义 API就是别人定义好的工具类和工具包目的&#xff1a;避免重复造轮子&#xff0c;提升开发效率&#xff0c;更加专注于实现业务逻辑 Object 类 object类是所有类的祖宗类&#xff0c;所有的类型都是可以使用Object的方法的 最常见的三个方法&#xff1a; toString:print就会…

【项目实战】——商品管理的制作完整代码

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

3. python练习题3-自由落体

3. python练习题3-自由落体 【目录】 文章目录 3. python练习题3-自由落体1. 目标任务2. 解题思路3. 知识回顾-%占位符格式化处理3.1 概述3.2 占位符的多种用法3.3 格式化操作符辅助指令3.4 将整数和浮点数格式化为字符串 4. 解题思路4.1 球第1次下落4.2 球第2次下落 5. 最终代…

C++(语法以及易错点2)

1.内联函数 1.1 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 ​int ADD(int a,int b) {return ab; }​ 1.2 特性 1. inline是一种以空间换时间…

【Python基础教程】5. 数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

Taro + vue3 小程序封装标题组件

分为没有跳转页面的title组件和 有跳转页面的title组件 我们可以把这个封装成一个组件 直接上代码 <template><div class"fixed-title-container"><div class"box"><div class"icon" v-if"isShow" click"…

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中&#xff0c;会遇到很多故障汇总了常见的故障&#xff0c;MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

1.JavaEE进阶篇 - 为什么要学习SpringBoot呢?

文章目录 1.为什么要学框架&#xff1f;2.框架的优点展示(SpringBoot VS Servlet)2.1 Servlet 项⽬开发2.1.1 创建项⽬2.1.2 添加引⽤2.1.3 添加业务代码2.1.4 运⾏项⽬(配置tomcat)2.1.5 Maven配置2.1.5.1修改本地Maven仓库地址2.1.5.2 配置settings.xml文件2.1.5.3项目 本地仓…

C++:函数重载和引用

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习C&#xff1a;函数重载和引用&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 函数重载1.函数重载的概念为什么C支持函数重载 引用引用的概念引…

计算机网络-HTTP相关知识-基础

HTTP基础 基本概念&#xff1a;HTTP是一种计算机之间交流通信的规范&#xff0c;它允许数据在两点之间传输&#xff0c;这个过程可以包括中转或接力。HTTP不仅仅包括文本&#xff0c;还可以包括图片、音频等超文本。状态码&#xff1a;HTTP状态码分为五类&#xff1a; 2xx&…

C++的 stack和queue 的应用和实现【双端队列的理解和应用】

文章目录 stack的理解和应用栈的理解栈的模拟实现string实现stackvector实现stack queue的理解和应用队列的理解队列的模拟实现 双端队列原理的简单理解deque的缺陷为什么选择deque作为stack和queue的底层默认容器STL标准库中对于stack和queue的模拟实现stack的模拟实现queue的…

深度学习pytorch好用网站分享

深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f

木棍【dfs搜索优化】

木棒 题目描述 输入样例&#xff1a; 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0输出样例&#xff1a; 6 5【思路】 优化 【AC代码】 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 70;int w[N], sum, length,…

C语言中的结构体:高级特性与扩展应用

前言 结构体在C语言中的应用不仅限于基本的定义和使用&#xff0c;还包含一些高级特性和扩展应用&#xff0c;这些特性和应用使得结构体在编程中发挥着更加重要的作用。 一、位字段&#xff08;Bit-fields&#xff09; 在结构体中&#xff0c;我们可以使用位字段来定义成员…

CMOS传输门与三态输出门电路

传输门&#xff08;TG&#xff09;的应用比较广泛&#xff0c;在数字电路和模拟电路中均有作用。 在数电中&#xff1a;作为基本单元电路构成各种逻辑电路&#xff1b;在模电中&#xff1a;可在取样-保持电路、斩波电路、数模转换器中传输模拟信号&#xff0c;所以又叫模拟开关…

AssetBundle在移动设备上丢失

1&#xff09;AssetBundle在移动设备上丢失 2&#xff09;Unity云渲染插件RenderStreaming&#xff0c;如何实现多用户分别有独立的操作 3&#xff09;如何在圆柱体类型的地图中编程玩家的输入 4&#xff09;Mixamo动画的根运动问题 这是第380篇UWA技术知识分享的推送&#xff…

【保姆级讲解如何安装与配置Node.js】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Java中的网络编程(一)

一、网络编程概述 什么是计算机网络把不同区域的计算机&#xff08;广义&#xff09;通过通信设备和线路连接&#xff0c;可以实现数据的传输和共享的系统。实现不同计算机之间的练习&#xff0c;必须有介质连接。网络编程是干什么的聊天-->聊天软件 QQjava语言是支持网络间…

汽车EDI:如何与奔驰建立EDI连接?

梅赛德斯-奔驰是世界闻名的豪华汽车品牌&#xff0c;无论是技术实力还是历史底蕴都在全球汽车主机厂中居于领先位置。奔驰拥有多种车型&#xff0c;多元化的产品布局不仅满足了不同用户画像的需求&#xff0c;也对其供应链体系有着极大的考验。 本文将为大家介绍梅赛德斯-奔驰乘…