Использование Python Rest API
Фото:Douglas LopesonUnsplash
В этом посте я расскажу о том, как создать простой сервер и несколько клиентов/устройств, которые взаимодействуют с помощью остальных вызовов.
В качестве базы данных мы будем использовать 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.
python3 device.py 1python3 device.py 2
GitHub - pietrocolombo/example_api_rest_python
Внесите свой вклад в разработку pietrocolombo/example_api_rest_python, создав учетную запись на GitHub.
github.com