使用 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 Flaskapp = 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 osapp = 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 = usernameself.email = emailclass UserSchema(ma.Schema):class Meta:# Fields to exposefields = ('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 = emailuser.username = usernamedb.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 = usernameself.email = email

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

class UserSchema(ma.Schema):class Meta:# Fields to exposefields = ('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 = emailuser.username = usernamedb.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 编写小型测试。

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

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

相关文章

Netty的只读ByteBuf

说明 通过io.netty.buffer.ByteBuf的asReadOnly()函数&#xff0c;可以返回一个只读的ByteBuf&#xff1b;通过isReadOnly()函数&#xff0c;可以判断该ByteBuf是否是只读的。 示例 package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled;publi…

基于java+Apriori算法的网络书城设计与实现

摘要 网络技术的发展市场的销售模式发生了巨大的改变&#xff0c;现在销售网站引用电子商务网站网站设计的基本流程&#xff0c;引用网站网站的开发生命周期法和结构化方法&#xff0c;使用JSP语言来设计并实现了书籍网上销售网站。本书籍销售网站分为前台、后台两个模块。前台…

汽车基础软件新「战争」:群雄混战,谁在抢跑?

中国车用基础软件迎来了发展的黄金窗口期。 当前&#xff0c;汽车电子电气架构正在加速向“跨域融合”的时代演进&#xff0c;汽车软件架构也在加速向SOA架构升级&#xff0c;软硬件分层解耦成为了实现“软件定义汽车”新开发模式的前提。 过去&#xff0c;汽车的所有功能开发…

Activiti7

文章目录 概述入门案例1.创建springboot项目pom.xml 2.获取ProcessEngine2.1 默认的方式2.2 编程方式获取2.3 表结构介绍 3.在线流程设计器 概述 官网地址&#xff1a;https://www.activiti.org/ Activiti由Alfresco软件开发&#xff0c;目前最高版本Activiti 7。是BPMN的一个…

Flutter iOS 集成使用 flutter boost

在 Flutter项目中集成完 flutter boost&#xff0c;并且已经使用了 flutter boost进行了路由管理&#xff0c;这时如果需要和iOS混合开发&#xff0c;这时就要到 原生端进行集成。 注意&#xff1a;之前建的项目必须是 Flutter module项目&#xff0c;并且原生项目和flutter m…

【Spring】Spring之事务底层源码解析

目的 能使用spring事务解决开发需求了解spring事务是如何被spring管理的了解spring事务底层原理实现&#xff0c;比如代理、事务传播机制等 Spring事务简单使用 配置数据源及事务管理器&#xff1a; Component ComponentScan("com.firechou.aop") EnableTransact…

bigemap如何添加高清在线地图?

说明&#xff1a;批量添加可以同时添加多个在线地图&#xff0c;一次性添加完成&#xff08;批量添加无法验证地址是否可以访问&#xff09; 添加后如下图&#xff1a; 第一步 &#xff1a; 制作地图配置文件&#xff1a;选择添加在线地图&#xff08;查看帮助&#xff09;。 …

Chatgpt AI newbing作画,文字生成图 BingImageCreator 二次开发,对接wxbot

开源项目 https://github.com/acheong08/BingImageCreator 获取cookie信息 cookieStore.get("_U").then(result > console.log(result.value)) pip3 install --upgrade BingImageCreator import os import BingImageCreatoros.environ["http_proxy"]…

基于 yolov8 的人体姿态评估

写在前面 工作中遇到&#xff0c;简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停…

华为认证 | 云计算HCIE3.0改版后有什么变化?

随着技术的不断进步和行业的发展&#xff0c;云计算的HCIE作为华为公司的顶级认证&#xff0c;也进行了版本的更新。 那改版后有哪些变化呢&#xff0c;今天给大家讲讲。 01 HCIE认证简介 HCIE认证是华为公司旗下的顶级专业认证&#xff0c;面向IT领域的高级专业人士。 它涵…

83 | Python可视化篇 —— Bokeh数据可视化

Bokeh 是一种交互式数据可视化库,它可以在 Python 中使用。它的设计目标是提供一个简单、灵活和强大的方式来创建现代数据可视化,同时保持良好的性能。Bokeh 支持多种图表类型,包括线图、散点图、柱状图、饼图、区域图、热力图等。此外,它还支持将这些图表组合在一起以创建…

收集到大量的名片怎么转为excel?

来百度APP畅享高清图片 参加完展会或集体会议&#xff0c;是不是收了一大堆名片&#xff0c;保管起来超级麻烦&#xff0c;还容易丢三落四&#xff1f;别急&#xff0c;我们有办法&#xff01;把名片转成电子版保存到电脑上就完美啦&#xff01;但要是名片数量有点多&#xff0…

ChatGPT应用在AIGC内容生产【赠书活动|第一期《硅基物语》】

文章目录 爆火的AI工具ChatGPT走入大众视野的AIGCAIGC领域的发展AIGC价值引领『赠书活动 &#xff5c; 第一期』 爆火的AI工具ChatGPT 2023年伊始&#xff0c;ChatGPT就火遍全网&#xff0c;成为了全球最快拥有1亿月活用户的产品。在地铁上、电梯中、咖啡厅到处都充满着讨论AI…

Glusterfs 调优

直接上干货&#xff0c;替换volume 名称&#xff0c;CPU、memory 根据实际机型来配置 gluster volume info gluster volume get user-data all |grep event -A7 net.ipv4.tcp_congestion_controlhtcp# // 打开metadata-cache,打开这个选项可以提高在mount端操作文件、目录元数…

后端开发, 接口幂等性是什么意思

在后端开发中,接口的幂等性是指同一个请求的多次执行所产生的效果与执行一次的效果相同。简而言之,对于同一个接口请求,无论发送多少次,其对资源的状态修改结果都是一致的。 幂等性在接口设计和实现中非常重要,特别是在涉及数据修改或资源状态变更的情况下。如果一个接口…

五、PC远程控制ESP32 LED灯

1. 整体思路 2. 代码 # 整体流程 # 1. 链接wifi # 2. 启动网络功能(UDP) # 3. 接收网络数据 # 4. 处理接收的数据import socket import time import network import machinedef do_connect():wlan = network.WLAN(network.STA_IF)wlan.active(True)if not wlan.isconnected(…

在 Spring Boot 应用程序中将 MapStruct 与 Lombok 结合使用的方法

在本文中&#xff0c;您将找到有关如何高效使用 MapStruct、Lombok 和 Spring Boot 的代码示例和说明。 介绍 当您实现任何规模的服务时&#xff0c;您通常需要将数据从一种结构移动到另一种结构。通常&#xff0c;这是在不同逻辑层使用的相同数据 - 在业务逻辑、数据库级别或…

perl脚本调用openssh不能正确执行(ctl_dir /root/.libnet-openssh-perl/ is not secure)的原因排查

在使用perl脚本的时候&#xff0c;通过Net::OpenSSH去获取执行节点的信息是一种常用的方法。在某个环境中&#xff0c;执行命令的时候出错&#xff0c;下面展示一下相关的代码 my $ssh_ops {user > "root", password > "password", master_opts >…

【BI系统】选型常见问题解答二

本文主要总结BI系统选型过程中遇见的常见问题&#xff0c;并针对性做出回答&#xff0c;希望能为即将选型&#xff0c;或正在选型BI系统的企业用户们提供一个快速了解通道。 有针对金蝶云星空的BI方案吗&#xff1f;能起到怎样的作用&#xff1f; 答&#xff1a;奥威BI系统拥…

20个Golang自动化DevOps库

探索 20 个用于简化任务和提高生产力的重要库。 Golang&#xff0c;也称为 Go&#xff0c;是一种静态类型、编译型编程语言&#xff0c;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它于 2009 年推出&#xff0c;旨在解决其他编程语言的缺点&#xff0c;特…