Flask学习笔记(1)创建RESTful API

news2024/12/30 2:07:43

  从本文起,笔者将会更新一系列Flask学习笔记。
  本文将会讲述在Flask中如何创建RESTful API。在此之前,我们有必要了解下什么是RESTful架构。

RESTful架构

  RESTful架构自从2000年被Roy Feilding提出后就受到广泛关注,并被成功地应用于成千上万的系统之中。REST已经是web相关应用中的重要技术之一,它极有可能也会在手机和IOT相关应用中快速增长。RESTful架构受欢迎之处,在于它是目前最流行的一种互联网软件架构,其结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
  那么,什么是RESTful架构?
  REST,即Representational State Transfer的缩写。

RESTful架构示意图

资源(Resources)

  REST的名称"表现层状态转化"中,省略了主语。“表现层"其实指的是"资源”(Resources)的"表现层"。
  所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

表现层(Representation)

  “资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层”(Representation)。
  比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
  URI只代表资源的实体,不代表它的形式。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。

状态转化(State Transfer)

  访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
  互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
  客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

动词CRUDURL操作
GETReadhttp://host/resource获取所有的资源
GETReadhttp://host/resource/1获取id为1的资源
POSTCreatehttp://host/resource使用POST方法,从表格(form)数据中新建资源
PUTUpdatehttp://host/resource/1对id为1的现有资源进行修改
DELETEDeletehttp://host/resource/1删除id为1的资源

关于RESTful API的例子

  下面我们将用Flask框架来实现RESTful风格的API,用于模拟数据库中persons表中的新增、修改、查询和删除操作。
  完整的Python实现代码如下:

# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify


app = Flask(__name__)

persons = [{'name': 'Alex', 'city': 'New York'},
           {'name': 'Bob', 'city': 'London'}]


@app.route('/persons', methods=['GET'])
def index():
    return jsonify(persons)


@app.route('/persons/<int:_id>', methods=['GET'])
def get_person_by_id(_id):
    if _id in range(len(persons)):
        return jsonify(persons[_id])
    else:
        return jsonify(f"{_id} is not in db.")


@app.route('/persons/<int:_id>', methods=['PUT'])
def update_person_by_id(_id):
    data = request.json
    if data['city']:
        persons[_id]["city"] = data['city']
    if data['name']:
        persons[_id]["name"] = data['name']
    return jsonify({"person": data})


@app.route('/persons/<int:_id>', methods=['DELETE'])
def delete_person_by_id(_id):
    if _id in range(len(persons)):
        person = persons[_id]
        persons.remove(person)
        return jsonify(person)
    else:
        return jsonify(f"{_id} is not in db.")


@app.route('/persons', methods=['POST'])
def create_person():
    data = request.json
    persons.append(data)
    return jsonify({"person": data})


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

  已有Python第三方模块flask-restful可快速完成Restful风格的API开发,实现代码如下:

# -*- coding: utf-8 -*-
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource

app = Flask(__name__)
api = Api(app)

persons = [{'name': 'Tom', 'city': 'New York'},
           {'name': 'Green', 'city': 'London'}]


def abort_person_doesnt_exist(_id):
    if _id not in range(len(persons)):
        abort(404, message=f"id {_id} doesn't exist")


parser = reqparse.RequestParser()
parser.add_argument('name', type=str, default='')
parser.add_argument('city', type=str, default='')


class Person(Resource):
    def get(self, _id):
        abort_person_doesnt_exist(_id)
        return persons[_id]

    def delete(self, _id):
        abort_person_doesnt_exist(_id)
        person = persons[_id]
        persons.remove(person)
        return person

    def put(self, _id):
        abort_person_doesnt_exist(_id)
        args = parser.parse_args()
        if args['city']:
            persons[_id]["city"] = args['city']
        if args['name']:
            persons[_id]["name"] = args['name']
        return persons[_id]


class Persons(Resource):
    def get(self):
        return persons

    def post(self):
        args = parser.parse_args()
        persons.append({'name': args['name'], 'city': args['city']})
        return args


api.add_resource(Persons, '/persons')
api.add_resource(Person, '/persons/<int:_id>')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

利用Postman发送请求

  我们使用Postman来发送HTTP请求,用于测试接口是否完成对应的功能。以下是测试过程

  • 获取所有的人物(GET请求)
    获取所有的人物
  • 获取id为1的人物(GET请求)
    获取id为1的人物
  • 获取id为2的人物(GET请求,会报错)
    获取id为2的人物
  • 修改id为1的人物(PUT请求)
    修改id为1的人物
  • 获取所有的人物(GET请求)
    获取所有的人物
  • 新增人物(POST请求)
    新增人物
  • 获取所有的人物(GET请求,此时获取id为2的人物不会报错)
    获取所有的人物
  • 删除id为1的人物(DELETE请求)
    删除id为1的人物
  • 获取所有的人物(GET请求)
    获取所有的人物

总结

  本文重点介绍了Restful框架,以及如何在Flask中实现Restful风格的API。
  Flask是一个简单好用,稳定高效,且久经考验的Web框架,笔者后续将持续地学习Flask框架并输出文章及自己的体会和心得,欢迎大家关注。

参考文献

  1. 书籍Mastering Flask Web Development(Second Edition), Daniel Gasper and Jack Stouffer, Chapter 8, Page 157-166
  2. Flask-RESTful: http://www.pythondoc.com/Flask-RESTful/index.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美国同事的那些离职类型

这次公司的裁员是教科书基本的真的是没错。 但是美国同事的心态和离职类型也让人打开眼界。 后来在公司同事建立的被裁群中才了解到&#xff0c;PM 组也是重灾区&#xff0c;也超过了 50%&#xff0c;不少在公司工作超过 5 年的 PM 都被毫不留情的裁掉了。 就算这次勉勉强强被…

怎么实现常用网络接口自动化测试框架应用?

一、RESTful&#xff08;resource representational state transfer)类型接口测试 (一&#xff09;GUI界面测试工具&#xff1a;jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

达梦主备守护集群介绍

DM数据守护一主一备或一主多备是一种集成化的高可用、高性能数据库解决方案&#xff0c;是数据库异地容灾的首选方案。通过部署 DM 数据守护&#xff0c;可以在硬件故障&#xff08;如磁盘损坏&#xff09;、自然灾害&#xff08;地震、火灾&#xff09;等极端情况下&#xff0…

javaScript蓝桥杯----收集帛书碎⽚

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 三叔在外出考古途中⽆意发现了⼀份战国帛书&#xff0c;帛书边缘有被明显裁剪过的痕迹&#xff0c;单从帛书⽚段&#xff0c;提到记录了神秘⽂物的地点&#xff0c;⽆奈帛书不完整&#xff0c;为了早⽇将⽂物带回博物…

chatgpt赋能python:PythonGUI入门指南:如何安装各种GUI工具包

Python GUI入门指南&#xff1a;如何安装各种GUI工具包 如果你是一名Python开发人员&#xff0c;那么你肯定知道GUI是不可或缺的。它是让用户和程序之间进行交互的一种方法。在Python中&#xff0c;有很多GUI工具包可以选择。但是&#xff0c;安装它们可能会让人感到困惑。在这…

短视频矩阵系统源码

短视频矩阵源码是一种基于短视频技术开发的软件源代码&#xff0c;它包含了短视频录制、编辑、发布以及播放等模块的实现。该源码可以为开发者提供一个快速搭建短视频应用的基础架构&#xff0c;帮助开发者节省大量的时间和精力&#xff0c;同时提高了应用的开发效率和质量。通…

PCL 三角插值

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 地理信息中经常会用到三角插值这种方式来获取指定位置的高程值。其原理如下所述: 假设有一个三角形是这样的: 此外,假设每个顶点(角)都有某种关联值。例如:假设每个顶点都有一个相关联的颜色(或高程值等)。这个…

ubuntu16+nvidia驱动+cuda+an +pytorch安装

一、ubuntu16.04 通过镜像安装 二、nvidia驱动 1、 命令行输入 ubuntu-drivers devices 会出现可以安装以及推荐的驱动&#xff0c;后面带recommended就是推荐的版本 2、安装 驱动 sudo apt-get install nvidia-465 3、不过我安装的是384的版本&#xff0c;安装好后输入 nvid…

【JavaSE】Java(五十二):核心要点总结

文章目录 1. java中普通类和抽象类有哪些区别2. 接口和抽象类有什么区别3. java中的IO流分为几种4. BIO、NIO、AIO 有谁没区别5. Files 的常用方法有哪些 1. java中普通类和抽象类有哪些区别 Java中普通类&#xff08;也就是非抽象类&#xff09;和抽象类有以下几个区别&#x…

chatgpt赋能python:Python如何算圆的面积

Python如何算圆的面积 在数学中&#xff0c;一个圆的面积通过以下公式计算&#xff1a;S πr&#xff0c;其中S是圆的面积&#xff0c;r是圆的半径&#xff0c;π是一个常数&#xff0c;约等于3.14。 Python是一种用于编写高级程序的解释型编程语言。作为一种动态语言&#…

chatgpt赋能python:Python如何自动换行

Python如何自动换行 在Python编程中&#xff0c;有时候我们需要输出很长的文本或字符串&#xff0c;这时候就需要自动换行的功能。本文将介绍Python中实现自动换行的几种方法。 方法一&#xff1a;使用字符拼接 在Python中&#xff0c;我们可以使用"“来拼接字符串。如…

chatgpt赋能python:Python如何更改目录

Python如何更改目录 介绍 Python作为一门通用编程语言&#xff0c;提供了许多用于操作计算机文件系统的方法&#xff0c;其中就包括更改目录的方法。更改目录可以让我们在不离开当前脚本的情况下&#xff0c;改变当前脚本操作文件的位置&#xff0c;使我们更容易管理和访问所…

Leetcode刷题笔记--Hot01-10

1--两数之和 讲解参考&#xff1a;LeetCode 最热门 100 题 主要思路&#xff1a; 对数组进行从小到大的排序&#xff0c;使用两个指针指向第一个元素和最后一个元素&#xff0c;即左指针指向第一个元素A[l]&#xff0c;右指针指向最后一个元素A[R]&#xff1b; 判断两个指针当前…

Threejs进阶之十七:Threejs中的Path、Shape和ShapeGeometry类

在实际的应用中&#xff0c;有时候需要我们根据一个二维图形拉伸为三维图形的情况&#xff0c;这就需要我们对Threejs中提供的二维图形相关的类有一个深入的了解&#xff0c;这一节我们就深入的聊一聊Threejs中的Path、Shape和ShapeGeometry类 目录 Path类构造函数常用属性常用…

chatgpt赋能python:Python字符串跨行:如何在代码中处理长字符串

Python字符串跨行&#xff1a;如何在代码中处理长字符串 当你编写Python代码时&#xff0c;可能会遇到需要编写很长的字符串的情况。例如&#xff0c;你可能需要将一大段文本或HTML代码嵌入到Python程序中。在这种情况下&#xff0c;你需要学会如何将长字符串跨行编写&#xf…

[chatGPT攻略] 如何检测文本内容是否由ChatGPT生成 ?

[chatGPT攻略] 如何检测文本内容是否由ChatGPT生成 ? 在 ChatGPT 爆火的两个月内&#xff0c;学生就已经自发用这种工具做作业、写论文偷懒&#xff0c;编剧会用它编故事试试出乎人意料的故事走向&#xff0c;文案编辑用它来给自己打工。 在用工具给自己省事这件事上&#xf…

无条件抽奖和条件抽奖(互动功能发起端JS-SDK)

无条件抽奖功能概述 允许开始前对抽奖进行奖品、中奖人数、中奖人员等设置&#xff0c;完成设置后可以开始抽奖。 本功能只支持讲师、嘉宾、助教、管理员这四种角色进行抽奖的发起和停止。支持自定义设置中奖用户信息采集字段。支持设置预设中奖用户。支持设置定时开奖可查看…

论文翻译——Test Selection for Deep Learning Systems

文章目录 AbstractIntroductionRelated work&#xff08;这部分没有翻译完全&#xff0c;我主要是用来做课程回报的&#xff0c;后面的实验就够讲了&#xff0c;这里就不讲了&#xff09;3 Motivation and Problem Definition4 Test Selection MetricsMetrics Derived from the…

C++与Qt深度融合:高效设计多线程应用框架

C与Qt深度融合&#xff1a;高效设计多线程应用框架 1. C与Qt线程的混合使用1.1 C线程与Qt线程的基本概念1.2 线程间的相互依赖关系1.3 设计合理的代码框架 二、深入理解C和Qt线程模型2.1 C线程模型2.2 Qt线程模型2.3 C和Qt线程模型的比较 三、C和Qt线程间的互操作性3.1 std::th…

chatgpt赋能python:Python如何获取微信聊天记录

Python如何获取微信聊天记录 作为世界上最受欢迎的即时通讯工具之一&#xff0c;微信被大量用户使用。然而&#xff0c;微信聊天记录的备份和管理是一个重要的问题&#xff0c;特别是对于那些需要在工作和个人生活中快速查找重要信息的人来说。 幸运的是&#xff0c;Python编…