使用Python的Rest API
在这篇文章中,我将谈论如何创建一个简单的服务器和多个客户端/设备,用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