Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 19, 2023 06:00:09

Misha_White
Зарегистрирован: 2017-07-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

API для приложений

Добрый день!

Подскажите, пожалуйста, в какую сторону копать.

Приложение на Python обладает некоторым функционалом. Запускается в виде службы в Windows.
Появилась необходимость сделать интерфейс (API) для взаимодействия с ним из другого приложения (запуск/останов, получение данных). Клиентское приложение может быть на другом компьютере.
В интернете по запросу API информация в основном по RESTAPI (взаимодействие через HTTP). Не хотелось бы ещё и вэбсервер поднимать для этого.


Офлайн

#2 Окт. 19, 2023 07:25:18

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

API для приложений

Прежде всего нужно понимать что есть в нем на данный момент

Создаете модуль который запускается рядом с вашим сервисом
Используете какойнить фреймворк для того что бы сделать RestAPI
то есть условно прослойку которая по хттп принимает отдает json
вот она принимает запрос от клиента, обрабатывает его и выполняет необходимые команды
в сторону вашего сервиса и так де их передает клиенту
FastApi, Aiohttp, flask, и так далее



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Окт. 19, 2023 10:37:16

Misha_White
Зарегистрирован: 2017-07-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

API для приложений

Приложение общается с оборудованием по com-портам. Умеет обращаться к БД.

А как прослойка будет общаться с моим приложением? Тоже по http (например FastAPI)? Чтобы моё приложение могло принимать http-запрсы опять же нужно поднимать какой-то web-сервер. Тогда зачем она, если можно внутри приложения реализовать RestAPI?




Офлайн

#4 Окт. 19, 2023 11:43:48

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

API для приложений

А вот на данный вопрос - должны ответить именно Вы
Мы понятия не имеем что у вас там запускается как служба, что оно делает, что есть в его АПИ и что и каким образом доступно
Ведь как то же вы с этой службой взаимодействуете? Остановить/запустить - без проблем
Но вы же хотите какой то обмен данных организовать.
Как же мы должны знать как он происходит сейчас и с чем?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Окт. 19, 2023 13:04:02

Misha_White
Зарегистрирован: 2017-07-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

API для приложений

Спасибо за ответ.

В том и дело, что сейчас оно никак ни с кем не обменивается. Опрашивает датчики и складывает данные в БД, пишет Логи.
Управлять можно только непосредственно на сервере путём запуска/останова службы Виндовс средствами операционной системы.

В его АПИ вообще ничего нет. Потому, что АПИ нет. Я только собираюсь его реализовать. А как и в каком виде это делать - хз. Самое простое, что придумывается - это через СУБД. Но, может есть какие-то ещё варианты, на подобии RestAPI, но не по http…

Реализовать нужно прием команд и их выполнение (какие команды и как выполнять я сам придумаю, вопрос именно в механизме обмена информацией)… Например, запрос статуса. Или опрос конкретного датчика из БД.

Офлайн

#6 Окт. 19, 2023 14:28:55

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

API для приложений

Ну хорошо!
Есть какаято служба/сервис - которая что-то там опрашивает и складывает в базу данных
В данном случае база данных у нас как основной источник информации
На сколько я понимаю само приложение никаких команд не принимает. Итого имеем:

1. Необходимо организовать прослойку которая будет слушать на каком-то порту запросы и по запросам
отдавать данные из базы или управлять службой. Тут не так много вариантов. Либо через сокеты делать либо через http (сайта и html страничек небудет так как они не нужны) и тут я бы рекомендовал посмотреть в сторону FastApi, aiohttp, sanic. Все это довольно такие простые фреймоворки с хорошей документацией. Вам всегото нужно запустить код на 30 строк который будет слушать порт и принимать входящие данные
например вы отправляете (чем угодно) стандартный http запрос на ваш апи в виде GET запроса или json
Ваш апи его обрабатывает и либо запускает команду управления сервером (2) либо возвращает запрос из базы (3)

2. Для того что бы управлять службой на винде можно заюзать win32api (pip install pywin32)
А далее

 import win32serviceutil
service_name = 'Имя твоей службы'
# Старт
try:
    win32serviceutil.StartService(service_name)
    print(f"Служба {service_name} запущена.")
except Exception as e:
    print(f"Ошибка запуска службы {service_name} : {e}")
# Стоп
try:
    win32serviceutil.StopService(service_name)
    print(f"Служба {service_name} остановлена.")
except Exception as e:
    print(f"Ошибка остановки службы {service_name} : {e}")

Но для такой простой задачи достаточно встроенного модуля python subprocess
subprocess.run()
В данном случае sc start - стандартная виндовая команда управления службами - о ней можно почитать отдельно

3. Получив запрос с параметрами от клиента, формируем запрос в базу данных - вытягиваем данные (обрабатываем если необходимо) и возвращаем клиенту
В данном случае вам ненужно думать кто за кем стоит и кого ждет. Пришел запрос от клиента, вы его споймали функцией - получили из него форму того что ищем - нашли в базе и тут же вернули
все;



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#7 Окт. 19, 2023 16:41:21

Misha_White
Зарегистрирован: 2017-07-19
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

API для приложений

Спасибо за ответ.
Не хотелось через сокеты делать. Попробую FastAPI.
По функционалу не совсем так, но не принципиально. Нужно не столько службой управлять (запустить/остановить) - это слишком просто, сколько управлять опросом датчиков. Инициировать разовый опрос одного датчика из другого приложения (на удалённом АРМе), например, с возвратом полученного значения. Но это частности. Главное, чтобы программа могла что-то принимать (команды: текст, JSON) и отдавать (текст, JSON).

На самом деле, у меня ещё Джанга есть на другом серваке. Думаю в её базу (или в отдельную через роутер) писать данные, чтобы через Джангу управлять кое-какими функциями, реализованными на стороне БД (менеджер расписаний, например). Да и Rest запросы можно прям из Джанги в приложение отправлять….



Офлайн

#8 Окт. 19, 2023 21:12:37

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2739
Репутация: +  183  -
Профиль   Отправить e-mail  

API для приложений

> В интернете по запросу API информация в основном по RESTAPI (взаимодействие через HTTP). Не хотелось бы ещё и вэбсервер поднимать для этого.

К сожалению сейчас постоянно приходится сталкиваться с существами которые только готовыми библиотеками умеют пользоваться и по этому никакого взаимодействия кроме RESTAPI-а для них не существует. Конечно же вебсёрвер & wsgi & FastApi и прочее для твоего приложения избыточна.

Я бы на твоём месте просто создал бы сетевой сокет и через него отсылал необходимые команды.
https://habr.com/ru/articles/149077/



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#9 Окт. 19, 2023 21:59:38

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

API для приложений

Rodegast
> В интернете по запросу API информация в основном по RESTAPI (взаимодействие через HTTP). Не хотелось бы ещё и вэбсервер поднимать для этого.К сожалению сейчас постоянно приходится сталкиваться с существами которые только готовыми библиотеками умеют пользоваться и по этому никакого взаимодействия кроме RESTAPI-а для них не существует. Конечно же вебсёрвер & wsgi & FastApi и прочее для твоего приложения избыточна.Я бы на твоём месте просто создал бы сетевой сокет и через него отсылал необходимые команды.https://habr.com/ru/articles/149077/

Сомнительно
Тут уже нужно более глубокое понимание сути происходящего и очереди сообщений и длина итд
Я уже не говорю про клиентскую часть - а выше
Misha_White
писал что как раз у него есть что-то на штанге откуда он хотел бы пулять команды и скорее всего результаты там же и отображать - так что повторюсь - сокеты тут запределом галактических империй

На счет FastAPI согласен - немного избыточно для такой простой задачи но очень хорошая дока на русском да и инструмент тестирования запросов из коробки
Однако же - более простым решением будет тот же
https://sanic.dev/en/
ну там вобще все для лымарей - 5 строк и готовая апка



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Окт. 19, 2023 22:02:06)

Офлайн

#10 Окт. 19, 2023 22:20:45

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2739
Репутация: +  183  -
Профиль   Отправить e-mail  

API для приложений

> писал что как раз у него есть что-то на штанге откуда он хотел бы пулять команды и скорее всего результаты там же и отображать - так что повторюсь - сокеты тут запределом галактических империй

И с чего ты сделал вывод что “сокеты тут запределом галактических империй”?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Окт. 19, 2023 22:26:53)

Онлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version