Найти - Пользователи
Полная версия: API для приложений
Начало » Python для экспертов » API для приложений
1 2 3
Misha_White
Добрый день!

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

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


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

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

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

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




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

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

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

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

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

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



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

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

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

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

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

И с чего ты сделал вывод что “сокеты тут запределом галактических империй”?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB