使用Python的Rest API

519 阅读2分钟

使用Python的Rest API

照片:Douglas LopesonUnsplash

在这篇文章中,我将谈论如何创建一个简单的服务器和多个客户端/设备,用rest调用进行通信。

我们将使用Python、Flask和SQLALCHEMY作为数据库。

我们的想法是有一个服务器来收集由多个设备产生的信息。

服务器

首先,我们从使用SQLALCHEMY保存数据开始实现服务器。

from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
api = Api(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

让我们创建两个表,一个叫设备,另一个叫数据,它们是相互关联的。

表的定义是通过创建类来表示它们。

class Device(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    status = db.Column(db.Boolean, nullable=False)
    config = db.Column(db.Integer, nullable=False)
    data = db.relationship('Data', backref='device', lazy=True, cascade="all, delete-orphan")
class Data(db.Model):
    id_device = db.Column(db.Integer, db.ForeignKey('device.id'), primary_key=True)
    timestamp = db.Column(db.Float, primary_key=True)
    data = db.Column(db.Float, nullable=False)
def __repr__(self):
    return f"Data(id_device = {self.id_device}, timestamp = {self.timestamp}, data = {self.data})"

现在我们可以定义数据的管理,这些数据将来自于设备,定义了API Rest。

由于数据将以JSON格式传递,我们定义了一个解析器,它将负责验证数据的格式是否正确。

device_data_put_args = reqparse.RequestParser()
device_data_put_args.add_argument("id_device", type=int, help="id device", required=True)
device_data_put_args.add_argument("timestamp", type=float, help="timestamp epoc", required=True)
device_data_put_args.add_argument("data", type=float, help="data", required=True)

在这种情况下,JSON将由3个参数组成(id_device, timestamp, data)。

我们定义的函数将在设备发出PUT请求时接收数据。

你也可以定义除了PUT之外的其他方法。

  • GET - 用于获取指定的资源
  • POST - 用于在指定的资源上创建新的数据
  • PUT - 用于在指定的资源上创建新的数据或替换现有的数据
  • PATCH - 用于在指定资源上创建新的数据或更新/修改现有数据
  • DELETE - 用于删除指定资源的现有数据。

现在让我们把这个类和与调用相关的URL联系起来。

api.add_resource(DataDevice, "/data_device")

如果你想把参数直接传入URL,你必须声明将到达的变量类型和相关名称。

api.add_resource(ConfigUpdate, "/config_update/<int:id_device>")

接下来,当定义处理调用的方法时,它们将有两个参数,就像这里。

def patch(self, id_device):

客户端

客户端/设备端数据传输是非常简单的。

try:    resp = requests.put(BASE_SERVER + 'data_device', json=send_data)    resp.raise_for_status()except HTTPError as http_err:    logging.warning(f'HTTP error occurred: {http_err}')    return respexcept Exception as err:    logging.warning(f'Other error occurred: {err}')    returnelse:    if resp.status_code == 201:        # update configuration        self.config = resp.json()

数据可视化

此外,我还添加了一个用于数据可视化的网页。

图片由作者提供

其中可以查看http://127.0.0.1:5000

下面是我留下的存储库。

要启动服务器。

python3 server.py

要启动设备,在python3 device.py后面加上id

python3 device.py 1python3 device.py 2

GitHub - pietrocolombo/example_api_rest_python

通过在GitHub上创建一个账户,为pietrocolombo/example_api_rest_python的开发做贡献。

github.com

(github.com/pietrocolom…)