如何使用更好的 REST API 来创建 Flask API 并编写单元测试代码?
REST API介绍

API
API,全称是ApplicationProgrammingInterface(应用程序编程接口)。简单来说,就是品牌自己开发的一个界面,以便第三方可以额外开发并应用到自己的产品中。产品上的系统通讯接口。
REST API
REST 是一种通过 HTTP 协议设计 API 的架构风格。它的主要优点是具有很大的灵活性。当开发人员需要将数据直接从服务器传递给 Web 应用程序或网站的用户时,他们会使用 REST API。
REST API 的主要组件:
- 客户端 - 在用户端(在其设备上)发起通信的客户端或程序。
- 服务器 - 可使用 API 访问其功能和数据的服务器。
- 资源 - 服务器传输到客户端的任何内容(视频、文本、图像)。
REST API 通过 HTTP 请求进行通信,完成以下功能——创建、读取、更新和删除数据。它们也称为 CRUD 操作。 REST 提供有关所请求资源的信息,并使用四种方法来描述如何处理资源:
- POST - 创建资源;
- GET — 获取资源;
- PUT — 更新资源;
- DELETE — 删除资源。
RESTful API
REST,全称是Representational State Transfer(表现层状态转移),是一种设计风格,RESTful只是变成了一个形容词,就像peace一样,把名词peace变成了转化为形容词“peace”,RESTful描述的是按照这个规范设计的API,称为RESTful API。
RESTful API 主要由三个组件组成:
- 名词 名词:定义资源位置的 URL。每个资源在互联网上都有一个唯一的位置,就像每个家庭都有一个唯一的位置一样。地址是一样的。
- 动词 动词:对资源执行的操作。
- 内容类型 资源表示方式:API资源可以采用不同的方式表示,最常用的是JSON,它轻量且易于处理。
因此使用RESTful风格设计的API有以下优点和局限性:
- 有唯一的指示资源位置的URL和统一的API接口。 (统一接口)
- 无状态。 (无状态)
Restful API 它允许应用程序集成应用程序或与 Restful Web 服务交互。它现在正在成长为微服务架构中连接组件的最常见方法。借助 API,我们可以向网站接收或发送数据并执行一些操作,目的是通过 Web 服务完成我们的任务。每个网站都使用不同类型的API,例如股票交易网站,在API的帮助下他们可以获取当前价格和涨跌幅。
创建第一个 REST API
同样,我们创建 Hello World API,这意味着当您向它发出请求时,您会收到 JSON 响应。通常,API 返回 JSON 类型的响应。接下来,使用 pip 包管理器安装 Flask:
pip install flask
pip install flask-restful
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class Helloworld(Resource):
def __init__(self):
pass
def get(self):
return {
"Hello": "World"
}
api.add_resource(Helloworld, '/')
if __name__ == '__main__':
app.run(debug=True)
ok。到目前为止,第一个 Rest API 已经创建。看起来很简单。那么,什么是Flask-Restful?
Flask Restful 定义了一个资源类,其中包含每个 HTTP 方法的方法。方法名称应与其对应的HTTP方法相同,并以小写形式书写,如上面的代码所示。我们发现这些方法没有路由装饰器,这是因为它们是基于资源路由的。无论定义哪个类,我们都可以使用 add_resource 方法定义路由并在适当的路由处调用该类。
注意:在上面的代码中,我们首先加载所需的父类,然后初始化我们的应用程序和API。然后我们创建了一个程序,并发出一个 GET 请求,表示当有人单击该程序时,他将获得 hello world 作为 JSON 格式的响应。要打开特定的 URL,我们使用 add-resource 方法并将其路由到默认链接。要运行此文件,您可以使用 POSTMAN 工具,这是一个用于创建、测试和管理 API 的 API 维护工具。您还可以使用请求模块使用以下代码来测试此 API。首先,运行上面的文件,它会给你localhost URL,然后在另一个命令提示符下,运行下面的代码文件:
import requests
url = "http://127.0.0.1:5000/"
response = requests.get(url=url)
print(response.text)
{
"Hello": "World"
}
通过Flask RESTApi理解HTTP请求
通过学习上面的内容,相比大家已经有了对 REST API 的初步印象。接下来,我们将继续使用 REST API 探索不同的 HTTP 方法,其中我们将定义一个列表,该列表将以字典(JSON 对象)的形式存储从服务器接收的所有数据。这很重要,因为我们在项目中使用与其他地方不同的 API 来获取数据。
首先创建一个API,创建3个HTTP方法,分别命名为GET、POST和DELETE,并在其中创建自定义URL。当您调用 POST 方法时,它将以名称作为输入;如果您要求 GET 方法进行 DELETE,如果该名称存在,我们将删除该名称,并且再次访问将返回 NULL。
创建一个文件并写入以下代码:
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
data = []
class People(Resource):
def get(self):
for x in data:
if x['Data'] == name:
return x
return {'Data': None}
def post(self, name):
temp = {'Data': name}
data.append(temp)
return temp
def delete(self):
for ind, x in enumerate(data):
if x['Data'] == name:
temp = data.pop(ind)
return {'Note': 'Deleted'}
api.add_resource(People, '/Name/')
if __name__ == '__main__':
app.run(debug=True)
打开POSTMAN API工具并单击任何HTTP方法请求。首先,当我们使用 post 请求名称时,它会给我们一个 name
。根据接收请求,我们将返回 Name
。删除时它将被删除,当您再次获取它时,它将返回 NULL。
结果如下
如何在Flask REST API中使用装饰器
我们将装饰器与API一起用于IP地址、cookie等。装饰器是一个函数,它接受另一个函数作为参数并返回另一个函数。也可以理解为在现有功能的基础上提供一些附加的功能,而不需要对实际功能进行修改或修改的功能。
在这里我们将创建一个新文件夹,我将通过创建两个装饰器来演示这一点。在第一个文件中,编写一个外部时间函数,该函数返回代码的执行时间。我们从 functools
模块(上述 Python 函数的默认模块)导入应用于包装函数的包装装饰器。它通过复制所有参数来更新包装函数。
from flask import Flask
from flask_restful import Resource, Api
import datetime
from flask import request
from functools import wraps
app = Flask(__name__)
api = Api(app)
def time(function=None):
@wraps(function)
def wrapper(*args, **kwargs):
s = datetime.datetime.now()
_ = function(*args, **kwargs)
e = datetime.datetime.now()
print("Execution Time : {} ".format(e-s))
return _
return wrapper
class HelloWorld(Resource):
@monitor
def get(self):
return {"hello": "world"}
api.add_resource(HelloWorld, "/")
if __name__ == "__main__":
app.run(debug=True)
我们将创建第二个装饰器来监视 cookie 和 IP 地址,因此创建以下函数。不要向 hello world 函数添加时间装饰器,而是添加监视器装饰器并运行代码。
def monitor(function=None):
@wraps(function)
def wrapper(*args, **kwargs):
_ = function(*args, **kwargs)
print("Ip Address : {} ".format(request.remote_user))
print("Cookies : {} ".format(request.cookies))
print(request.user_agent)
return _
return wrapper
如何让Flask API更加安全
我们在设计API的时候也要注意安全性,因为很多人会访问它。由于API可能包含一些两方之间的机密数据,因此我们可以指定只有授权人员才能访问该API。我们应该做什么?此时可以使用 Flask 基本身份验证。当然,需要使用pip命令来安装活塞模块。
pip install flask-httpauth
我们构建一个 API 并定义包含用户名和密码的用户数据字典。在实际用例中工作时,可以通过配置文件或从数据库接受用户名和密码。首先,我们创建一个 main 函数来匹配用户名和密码,并创建一个 GET 方法,该方法表示任何点击此 API 的人都无法在未登录的情况下访问数据。 POSTMAN,我们尝试在不登录的情况下获取数据,以显示对您的未经授权的访问。
现在转到授权并单击基本授权。输入用户名和密码,点击GET请求即可得到想要的结果。
这就是保护Flask API的方法,也是最基本的方法。当然,还有更高级的方法,这里就不介绍了。
如何在 Flask API 上启用跟踪
到目前为止,我们已经了解了如何保护我们的 API 免受未经授权的登录,但如果我们还有访问者的位置(纬度和经度点)、IP 地址、服务器名称(例如详细信息)访问 API 的人的信息),我们还可以继续使用 REST API 配置基本的 Flask 跟踪应用程序。首先,使用PIP命令安装Flask跟踪包。
pip install flask-track-usage
让我们看看接下来的程序:
from flask import Flask, g
app = Flask(__name__)
app.config['TRACK_USAGE_USE_FREEGEOIP'] = False
app.config['TRACK_USAGE_INCLUDE_OR_EXCLUDE_VIEWS'] = 'include'
from flask_track_usage import TrackUsage
from flask_track_usage.storage.printer import PrintWriter
from flask_track_usage.storage.output import OutputWriter
t = TrackUsage(app, [
PrintWriter(),
OutputWriter(transform=lambda s: "OUTPUT: " + str(s))
])
@t.include
@app.route('/')
def index():
g.track_var["optional"] = "Write_Something"
return "Hello"
#Run the application
if __name__ == "__main__":
app.run(debug=True)
该程序通过导入跟踪使用情况、输入写入器和输出写入器
来创建跟踪应用程序。将 Bottle 应用程序添加到 track 包中,并使用输出编写器并使用 lambda 函数以字符串格式编写输出。然后在斜杠上创建基本路线并将跟踪应用程序作为装饰器包含在内。 g
表示global,表示上下文中的数据是全局的。因此,创建一个基本 API,在浏览器中返回 "Hello"
,同时在后端获取所有人员的信息。
如何为 REST API 编写单元测试代码
现在您已经为您的案例创建了一个不错的 REST API。尽管如此,我们还需要为REST API编写单元测试代码,以识别API的常见错误,确保生产安全至关重要。
下面是新建一个名为Run的文件,并开发如下简单的API。
from flask import Flask
from flask_restful import Resource, Api
import json
app = Flask(__name__)
api = Api(app)
class Helloworld(Resource):
def __init__(self):
pass
def get(self):
return json.dumps({"Message": "Fine"})
api.add_resource(Helloworld, '/')
if __name__ == '__main__':
app.run(debug=True)
现在创建另一个名为 test 的文件,并在其中编写代码来测试 API。最常见的场景是运行以下三个基本单元测试。
- 检查响应码是否为 200
- 检查 API 写入的内容是否为应用程序 JSON 格式
- 检查我们访问的所有密钥是否都存在于 API 数据处理中
from run import app
import unittest
class FlaskTest(unittest.TestCase):
#Check for response 200
def test_inde(self):
tester = app.test_client(self) #tester object
response = tester.get("/")
statuscode = response.status_code
self.assertEqual(statuscode, 200)
#check if the content return is application JSON
def test_index_content(self):
tester = app.test_client(self)
response = tester.get("/")
self.assertEqual(response.content_type, "application/json")
#check the Data returned
def test_index_data(self):
tester = app.test_client(self)
response = tester.get("/")
self.assertTrue(b'Message' in response.data)
if __name__ == '__main__':
unittest.main()
如果已有web 学过爬虫,你应该知道,200
响应意味着对特定 URL 的请求成功并返回了响应。
好了,这篇文章就到这里了。至此,我们学习了如何从头开始创建 Flask REST API 并轻松、安全地维护它。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。