Форум сайта python.su
Добрый день!
Подскажите, пожалуйста, в какую сторону копать.
Приложение на Python обладает некоторым функционалом. Запускается в виде службы в Windows.
Появилась необходимость сделать интерфейс (API) для взаимодействия с ним из другого приложения (запуск/останов, получение данных). Клиентское приложение может быть на другом компьютере.
В интернете по запросу API информация в основном по RESTAPI (взаимодействие через HTTP). Не хотелось бы ещё и вэбсервер поднимать для этого.
Офлайн
Прежде всего нужно понимать что есть в нем на данный момент
Создаете модуль который запускается рядом с вашим сервисом
Используете какойнить фреймворк для того что бы сделать RestAPI
то есть условно прослойку которая по хттп принимает отдает json
вот она принимает запрос от клиента, обрабатывает его и выполняет необходимые команды
в сторону вашего сервиса и так де их передает клиенту
FastApi, Aiohttp, flask, и так далее
Офлайн
Приложение общается с оборудованием по com-портам. Умеет обращаться к БД.
А как прослойка будет общаться с моим приложением? Тоже по http (например FastAPI)? Чтобы моё приложение могло принимать http-запрсы опять же нужно поднимать какой-то web-сервер. Тогда зачем она, если можно внутри приложения реализовать RestAPI?
Офлайн
А вот на данный вопрос - должны ответить именно Вы
Мы понятия не имеем что у вас там запускается как служба, что оно делает, что есть в его АПИ и что и каким образом доступно
Ведь как то же вы с этой службой взаимодействуете? Остановить/запустить - без проблем
Но вы же хотите какой то обмен данных организовать.
Как же мы должны знать как он происходит сейчас и с чем?
Офлайн
Спасибо за ответ.
В том и дело, что сейчас оно никак ни с кем не обменивается. Опрашивает датчики и складывает данные в БД, пишет Логи.
Управлять можно только непосредственно на сервере путём запуска/останова службы Виндовс средствами операционной системы.
В его АПИ вообще ничего нет. Потому, что АПИ нет. Я только собираюсь его реализовать. А как и в каком виде это делать - хз. Самое простое, что придумывается - это через СУБД. Но, может есть какие-то ещё варианты, на подобии RestAPI, но не по http…
Реализовать нужно прием команд и их выполнение (какие команды и как выполнять я сам придумаю, вопрос именно в механизме обмена информацией)… Например, запрос статуса. Или опрос конкретного датчика из БД.
Офлайн
Ну хорошо!
Есть какаято служба/сервис - которая что-то там опрашивает и складывает в базу данных
В данном случае база данных у нас как основной источник информации
На сколько я понимаю само приложение никаких команд не принимает. Итого имеем:
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}")
Офлайн
Спасибо за ответ.
Не хотелось через сокеты делать. Попробую FastAPI.
По функционалу не совсем так, но не принципиально. Нужно не столько службой управлять (запустить/остановить) - это слишком просто, сколько управлять опросом датчиков. Инициировать разовый опрос одного датчика из другого приложения (на удалённом АРМе), например, с возвратом полученного значения. Но это частности. Главное, чтобы программа могла что-то принимать (команды: текст, JSON) и отдавать (текст, JSON).
На самом деле, у меня ещё Джанга есть на другом серваке. Думаю в её базу (или в отдельную через роутер) писать данные, чтобы через Джангу управлять кое-какими функциями, реализованными на стороне БД (менеджер расписаний, например). Да и Rest запросы можно прям из Джанги в приложение отправлять….
Офлайн
> В интернете по запросу API информация в основном по RESTAPI (взаимодействие через HTTP). Не хотелось бы ещё и вэбсервер поднимать для этого.
К сожалению сейчас постоянно приходится сталкиваться с существами которые только готовыми библиотеками умеют пользоваться и по этому никакого взаимодействия кроме RESTAPI-а для них не существует. Конечно же вебсёрвер & wsgi & FastApi и прочее для твоего приложения избыточна.
Я бы на твоём месте просто создал бы сетевой сокет и через него отсылал необходимые команды.
https://habr.com/ru/articles/149077/
Офлайн
Rodegast
> В интернете по запросу API информация в основном по RESTAPI (взаимодействие через HTTP). Не хотелось бы ещё и вэбсервер поднимать для этого.К сожалению сейчас постоянно приходится сталкиваться с существами которые только готовыми библиотеками умеют пользоваться и по этому никакого взаимодействия кроме RESTAPI-а для них не существует. Конечно же вебсёрвер & wsgi & FastApi и прочее для твоего приложения избыточна.Я бы на твоём месте просто создал бы сетевой сокет и через него отсылал необходимые команды.https://habr.com/ru/articles/149077/
Отредактировано ZerG (Окт. 19, 2023 22:02:06)
Офлайн
> писал что как раз у него есть что-то на штанге откуда он хотел бы пулять команды и скорее всего результаты там же и отображать - так что повторюсь - сокеты тут запределом галактических империй
И с чего ты сделал вывод что “сокеты тут запределом галактических империй”?
Отредактировано Rodegast (Окт. 19, 2023 22:26:53)
Офлайн