使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明

        我将把这个系列分成 3 或 4 篇文章。在本系列的最后,您将了解使用flask构建 restful API 是多么容易。在本文中,我们将设置环境并创建将显示“Hello World”的终结点。

        我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文中介绍的代码,尽管在python 3.4或更高版本上可能没问题。

二、 安装flask

a. Installing flask

        Flask是python的微框架。微框架中的“微”意味着Flask旨在保持核心简单但可扩展(http://flask.pocoo.org/docs/0.12/foreword/#what-does-micro-mean)。您可以使用以下命令安装flask:

$ pip install Flask

b.准备您的 IDE

        实际上,您可以使用所有类型的文本编辑器来构建python应用程序,但是如果您使用IDE,则会容易得多。就我个人而言,我更喜欢使用jetbrains(PyCharm: the Python IDE for Professional Developers by JetBrains)的Pycharm。

c. 在flask中创造“你好世界”

        首先,您需要创建项目文件夹,在本教程中,我将它命名为“flask_tutorial”。如果您使用的是 pycharm,您可以通过从菜单中选择文件和新项目来创建项目文件夹。

 

之后,您可以设置项目位置和解释器。无论如何,您的计算机都可以有一些python解释器。

设置项目后,在pycharm上右键单击您的项目文件夹,然后选择新建-> Python文件并将其命名为“app.py”。

在 app.py 上写下下面的代码。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"


if __name__ == '__main__':
    app.run(debug=True)

        从终端运行它。您可以使用命令行或从pycharm单击位于左下角的终端选项卡并在下面编写代码。

$ python app.py

 

打开浏览器并访问本地主机:5000。瞧,现在您有了第一个烧瓶应用:)

        好的,现在让我们看一下代码。

from flask import Flask

        此行要求应用程序从烧瓶包导入烧瓶模块。用于创建 Web 应用程序实例的烧瓶。

app = Flask(__name__)

        此行创建 Web 应用程序的实例。__name__是 python 中的一个特殊变量,如果模块(python 文件)作为主程序执行,它将等于“__main__”。


@app.route("/")

        此行定义路由。例如,如果我们像上面一样将路由设置为“/”,如果我们访问 localhost:5000/,代码将被执行。您可以将路由设置为“/hello”,如果我们访问localhost:5000 / hello,将显示我们的“hello world”。

def hello():
    return "Hello World!"

        这条线定义了如果我们访问路由时将执行的函数。

if __name__ == '__main__':
    app.run(debug=True)

        此行表示如果我们从 app.py 运行,您的烧瓶应用将运行。另请注意,我们将参数设置为 。这将在网页上打印出可能的 Python 错误,帮助我们跟踪错误。debug true

        好的,这就是第 1 部分的全部内容,接下来我们将尝试使用 flask 在 SQLLite 上进行 CRUD 操作。

三、使用flask和SQLite构建简单的restful api

        在本文中,我将向您展示如何使用flask和SQLite构建简单的restful api,这些api具有从数据库中创建,读取,更新和删除数据的功能。

3.1  安装 flask-sqlalchemy and flask-marshmallow

        SQLAlchemy 是 python SQL 工具包和 ORM,可为开发人员提供 SQL 的全部功能和灵活性。其中 flask-sqlalchemy 是 flask 扩展,它添加了对 SQLAlchemy 的支持到 flask 应用程序 (Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (2.x))。      

        另一方面,flask-marshmallow 是 Fl​​ask 扩展,用于将 Flask 与 Marshmallow(对象序列化/反序列化库)集成。在本文中,我们使用flask-marshmallow 来渲染json 响应。

您可以使用 pip 轻松安装 flask-sqlalchemy 和 flask-marshmallow,使用以下命令:

$ pip install flask_sqlalchemy
$ pip install flask_marshmallow
$ pip install marshmallow-sqlalchemy

3.2.准备代码

        在名为 crud.py 的文件夹上创建新的flask_tutorial python文件。在 crud.py 中记下以下代码。

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'crud.sqlite')
db = SQLAlchemy(app)
ma = Marshmallow(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email


class UserSchema(ma.Schema):
    class Meta:
        # Fields to expose
        fields = ('username', 'email')


user_schema = UserSchema()
users_schema = UserSchema(many=True)


# endpoint to create new user
@app.route("/user", methods=["POST"])
def add_user():
    username = request.json['username']
    email = request.json['email']
    
    new_user = User(username, email)

    db.session.add(new_user)
    db.session.commit()

    return jsonify(new_user)


# endpoint to show all users
@app.route("/user", methods=["GET"])
def get_user():
    all_users = User.query.all()
    result = users_schema.dump(all_users)
    return jsonify(result.data)


# endpoint to get user detail by id
@app.route("/user/<id>", methods=["GET"])
def user_detail(id):
    user = User.query.get(id)
    return user_schema.jsonify(user)


# endpoint to update user
@app.route("/user/<id>", methods=["PUT"])
def user_update(id):
    user = User.query.get(id)
    username = request.json['username']
    email = request.json['email']

    user.email = email
    user.username = username

    db.session.commit()
    return user_schema.jsonify(user)


# endpoint to delete user
@app.route("/user/<id>", methods=["DELETE"])
def user_delete(id):
    user = User.query.get(id)
    db.session.delete(user)
    db.session.commit()

    return user_schema.jsonify(user)


if __name__ == '__main__':
    app.run(debug=True)

        对于短代码,上面的代码将具有 5 个端点,具有创建新记录、从数据库中获取所有记录、按 id 获取记录详细信息、更新所选记录和删除所选记录的功能。同样在此代码中,我们为数据库定义模型。

        让我们逐部分看一下代码

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os

        在这一部分,我们导入应用程序所需的所有模块。我们导入 Flask 来创建 Web 应用程序的实例,请求获取请求数据,jsonify 将 JSON 输出转换为具有应用程序/json mimetype 的对象,从 flask_sqlalchemy 到 访问数据库的 SQAlchemy,以及从flask_marshmallow到序列化对象的 Marshmallow。Response

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'crud.sqlite')

        这部分创建我们的 Web 应用程序的实例并设置我们的 SQLite uri 的路径。

db = SQLAlchemy(app)
ma = Marshmallow(app)

        在这一部分,我们将SQLAlchemy和棉花糖绑定到我们的烧瓶应用程序中。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

        导入 SQLAlchemy 并将其绑定到我们的烧瓶应用程序后,我们可以声明我们的模型。在这里,我们声明名为 User 的模型,并用它的属性定义它的字段。

class UserSchema(ma.Schema):
    class Meta:
        # Fields to expose
        fields = ('username', 'email')


user_schema = UserSchema()
users_schema = UserSchema(many=True)

        这部分定义了端点的响应结构。我们希望所有终结点都具有 JSON 响应。在这里,我们定义我们的 JSON 响应将有两个键(用户名和电子邮件)。此外,我们将user_schema定义为UserSchema的实例,user_schemas定义为UserSchema列表的实例。

# endpoint to create new user
@app.route("/user", methods=["POST"])
def add_user():
    username = request.json['username']
    email = request.json['email']
    
    new_user = User(username, email)

    db.session.add(new_user)
    db.session.commit()

    return jsonify(new_user)

        在这一部分,我们定义端点以创建新用户。首先,我们将路由设置为“/user”,并将HTTP方法设置为POST。设置路由和方法后,我们定义在访问此端点时将执行的函数。在此函数中,我们首先从请求数据中获取用户名和电子邮件。之后,我们使用请求数据中的数据创建新用户。最后,我们将新用户添加到数据库中,并以JSON形式显示新用户作为响应。

# endpoint to show all users
@app.route("/user", methods=["GET"])
def get_user():
    all_users = User.query.all()
    result = users_schema.dump(all_users)
    return jsonify(result.data)

        在这一部分中,我们定义端点以获取所有用户的列表,并将结果显示为JSON响应。

# endpoint to get user detail by id
@app.route("/user/<id>", methods=["GET"])
def user_detail(id):
    user = User.query.get(id)
    return user_schema.jsonify(user)

        就像这部分的前一部分一样,我们定义了端点来获取用户数据,但不是在这里获取所有用户,我们只是根据 id 从一个用户那里获取数据。如果仔细查看路由,可以看到此终结点的路由上有不同的模式。像“<id>”这样的父亲是参数,所以你可以用你想要的一切来改变它。这个参数应该放在函数参数上(在本例中为 def user_detail(id)),这样我们就可以在函数中获取这个参数值。

# endpoint to update user
@app.route("/user/<id>", methods=["PUT"])
def user_update(id):
    user = User.query.get(id)
    username = request.json['username']
    email = request.json['email']

    user.email = email
    user.username = username

    db.session.commit()
    return user_schema.jsonify(user)

        在这一部分中,我们定义端点以更新用户。首先,我们调用与参数上的给定 id 相关的用户。然后,我们使用请求数据中的值更新此用户的用户名和电子邮件值。

# endpoint to delete user
@app.route("/user/<id>", methods=["DELETE"])
def user_delete(id):
    user = User.query.get(id)
    db.session.delete(user)
    db.session.commit()

    return user_schema.jsonify(user)

        最后,我们定义要删除用户的端点。首先,我们调用与参数上的给定 id 相关的用户。然后我们删除它。

四、 生成 SQLite 数据库

        在上一步中,您已经编写了代码来处理SQLite的CRUD操作,但是如果您运行此python文件并尝试访问端点(您可以尝试访问localhost:5000 /user),您将收到类似于以下内容的错误消息

操作错误: (sqlite3.操作错误) 没有这样的表: 用户 [SQL: u'SELECT user.id AS user_id, user.username AS user_username, user.email AS user_email \nFROM user']

        出现此错误消息的原因是您尝试从 SQLite 获取数据,但您还没有 SQLite 数据库。因此,在此步骤中,我们将在运行应用程序之前先生成SQLite数据库。您可以使用以下步骤在 crud.py 中基于您的模型生成 SQLite 数据库。

  1. 进入 Python 交互式外壳

首先,您需要在终端中使用以下命令进入python交互式shell:

$ 蟒蛇

2. 导入数据库对象并生成SQLite数据库

在 python 交互式 shell 中使用以下代码

从原油导入数据库
>>> db.create_all()>>>

crud.sqlite将在您的flask_tutorial文件夹中生成。

五、 运行flask应用

        现在,在生成 sqlite 数据库后,我们就可以运行我们的烧瓶应用程序了。从终端运行以下命令以运行应用程序。

$ python crud.py

        我们已经准备好尝试我们的烧瓶应用。要在我们的烧瓶应用程序中尝试端点,我们可以使用 API 开发工具,例如 curl 或 postman。就我个人而言,我喜欢 api 开发的邮递员(Postman)。在本文中,我将使用邮递员来访问端点。

  1. 创建新用户

2. 获取所有用户

3. 通过 id 获取用户

4. 更新用户

5. 删除用户

六、后记

        这就是本文的全部内容。接下来,我计划使用 pytest 编写小型测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-Perl - fcntl函数

描述 该函数是系统fcntl()函数的Perl版本。使用FILEHANDLE上的SCALAR执行FUNCTION指定的功能。 SCALAR包含函数要使用的值,或者是任何返回信息的位置。 语法 以下是此函数的简单语法- fcntl FILEHANDLE, FUNCTION, SCALAR返回值 该函数返回0,但如果fcntl()的返回值为0,则返…

【Go语言】Golang保姆级入门教程 Go初学者chapter2

【Go语言】变量 VSCode插件 setting的首选项 一个程序就是一个世界 变量是程序的基本组成单位 变量的使用步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuxG8imp-1691479164956)(https://cdn.staticaly.com/gh/hudiework/imgmain/image-20…

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件&#xff0c;适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高&#xff1b;球…

< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >

文章目录 &#x1f4ac; 前言&#x1f449; 数组相关① 随机打乱数组顺序② 借助 new Set&#xff08;&#xff09;对数组去重 / 对象数组根据唯一值去重③ 查找数组中 【 最值 】 出现的索引 &#x1f449; Web浏览器相关① 重新加载当前页面&#xff0c;相当于 Ctrl R② 滚动…

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题 1、本方案默认本地已经安装了VScode与MobaXterm2、在服务器端3、在本地端安装MobaXterm4、测试5、opencv显示测试&#xff08;测试过程中需保持MobaXterm开启的状态&#xff09;6、 matplotlib显示测试&#x…

VSCode Remote-SSH (Windows)

1. VSCode 安装 VSCode 2. 安装扩展 Remote SSH Getting started Follow the step-by-step tutorial or if you have a simple SSH host setup, connect to it as follows: Press F1 and run the Remote-SSH: Open SSH Host… command.Enter your user and host/IP in the …

qemu 虚拟化

一、介绍QEMU Qemu是种非常古老的虚拟化技术&#xff0c;用于虚拟化系统组件并在其上运行多种CPU架构的程序或操作系统。 借助KVM&#xff0c;Qemu可以通过使用基于硬件的虚拟化来获得超快的计算速度。QEMU充当硬件供应商&#xff0c;KVM是CPU。KVM驻留在Linux内核中&#xff0…

Linux下的环境变量

目录 一、环境变量是什么&#xff1f;二、常见的环境变量三、查看环境变量的方法四、和环境变量相关的命令五、命令行参数五、环境变量通常是具有全局属性的 一、环境变量是什么&#xff1f; 环境变量通俗来说就是一种存储系统和应用程序运行需要的配置信息的方式。可以把环境…

Mr. Cappuccino的第57杯咖啡——简单手写Mybatis大致原理

简单手写Mybatis大致原理 大致原理项目结构项目代码代码测试 大致原理 底层基于JDK动态代理技术实现 项目结构 项目代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…

Flutter 自定义view

带进度动画的圆环。没gif&#xff0c;效果大家自行脑补。 继承CustomPainter&#xff0c;paint()方法中拿到canvas&#xff0c;绘制API和android差不多。 import package:flutter/material.dart;class ProgressRingPainter extends CustomPainter {double strokeWidth 20;Col…

整数规划——第三章 全单模矩阵

整数规划——第三章 全单模矩阵 若线性规划问题的约束矩阵为全单模矩阵&#xff0c;则该问题可行域的顶点都是整数点&#xff0c;从而线性规划与整数规划的最优解相同。 3.1 全单模性与最优性 考虑线性整数规划问题&#xff1a; (IP) min ⁡ c T x , s . t . A x ≤ b , x …

MATLAB的设置路径

在主页下的 或者在命令行输入path&#xff0c;命令行会出现所有路径 必须要将某些函数.m文件以及一些类文件包含在路径当中&#xff0c;否则在脚本代码中输入代码时&#xff0c;不会有代码提示

LeetCode96. 不同的二叉搜索树

96. 不同的二叉搜索树 文章目录 [96. 不同的二叉搜索树](https://leetcode.cn/problems/unique-binary-search-trees/)一、题目二、题解 一、题目 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的…

SpringBoot整合达梦数据库

近期接到了一个需要国产化的项目&#xff0c;用到了达梦数据库&#xff0c;没想到一开始配置就出现了问题&#xff0c;下面把配置给大家粘贴出来&#xff0c;大家少踩点坑。 一、先下载达梦数据库 这是达梦数据库下载链接&#xff0c;达梦数据库没有免费的&#xff0c;个人好…

Flask 是什么?Flask框架详解及实践指南

Flask 是一个轻量级的 Python Web 框架&#xff0c;它被广泛用于构建 Web 应用程序和 API。Flask 简单易用&#xff0c;具有灵活性和可扩展性&#xff0c;是许多开发者喜欢用其构建项目的原因。本文将介绍 Flask 是什么以及如何使用它来构建 Web 应用程序&#xff0c;同时提供一…

JavaScript基础 第一天

本套笔记是通过学习B站Pink老师JavaScript核心进阶 前端必学总结的学习笔记&#xff0c;希望自己之后在使用的过程中能够将所学知识融会贯通 学习目标 1. 理解变量是存储数据的容器 2.理解什么是数据并知道数据的类型 3.知道JavaScript数据类型转换的特征 学习目录 1.Jav…

排序进行曲-v4.0

文章目录 小程一言快速排序步骤详细解释具体步骤 举例总结 复杂度分析时间复杂度分析&#xff1a;空间复杂度分析&#xff1a;注意 应用场景总结 实际举例结果总结 代码实现结果解释 小程一言 这篇文章是在排序进行曲3.0之后的续讲&#xff0c; 这篇文章主要是对快速排序进行细…

[JAVAee]网络编程-套接字Socket

目录 基本概念 发送端与接收端 请求与响应 ​编辑客户端与服务器 Socket套接字 分类 数据报套接字 流套接字传输模型 UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 示例一: 示例二: TCP流数据报套接字编程 ServerSock…

Jupyter Notebook 遇上 NebulaGraph,可视化探索图数据库

在之前的《手把手教你用 NebulaGraph AI 全家桶跑图算法》中&#xff0c;除了介绍了 ngai 这个小工具之外&#xff0c;还提到了一件事有了 Jupyter Notebook 插件: https://github.com/wey-gu/ipython-ngql&#xff0c;可以更便捷地操作 NebulaGraph。 本文就手把手教你咋在 J…

设备管理平台:采用以可靠性为中心的维护策略的优势

在如今的工业领域&#xff0c;以可靠性为中心的维护策略正逐渐成为企业数字化转型的核心。无论是混合还是离散自动化应用&#xff0c;优化维护和工作流程实践已经成为提高利润、降低停机时间、增强运营和生产性能的不可或缺的一环。在这个过程中&#xff0c;设备管理系统与物联…