Code前端首页关于Code前端联系我们

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

terry 2年前 (2023-09-24) 阅读数 66 #后端开发
如何使用更好的 REST API 创建 Flask API及编写单元测试代码?

REST API介绍

如何使用更好的 REST API 创建 Flask 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有以下优点和局限性:

  1. 有唯一的指示资源位置的URL和统一的API接口。 (统一接口)
  2. 无状态。 (无状态)

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。

结果如下如何使用更好的 REST API 创建 Flask API及编写单元测试代码?如何使用更好的 REST API 创建 Flask API及编写单元测试代码?如何使用更好的 REST API 创建 Flask API及编写单元测试代码?

如何在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,我们尝试在不登录的情况下获取数据,以显示对您的未经授权的访问。 如何使用更好的 REST API 创建 Flask API及编写单元测试代码?

现在转到授权并单击基本授权。输入用户名和密码,点击GET请求即可得到想要的结果。 如何使用更好的 REST API 创建 Flask API及编写单元测试代码?

这就是保护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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门