Рубрики
Без рубрики

Запуск Локального Приложения Python Удаленно

Запустите приложение с вашего телефона на другой машине и получите вывод на свой телефон в течение нескольких секунд!

Автор оригинала: Matt Thommes.

Со старым Mac, который у меня валяется дома, и бесплатными веб-сервисами, я настроил простое приложение, которое извлекает некоторые данные из внешней службы ( YNAB ), чтобы выполнить некоторые ежедневные расчеты бюджета, которые я долгое время вычислял вручную. Вывод моего приложения затем отправляется обратно на мой телефон в течение нескольких секунд, чтобы я мог запустить его из любого места. Я хотел поделиться подходом, который я использую который мне ничего не стоил .

Это (очевидно) не тот подход, который следует использовать для крупномасштабных приложений или чего-либо, кроме домашних проектов. Я просто хотел подчеркнуть, насколько простым может быть использование существующих бесплатных инструментов. Существует множество недорогих, готовых к производству и масштабируемых вариантов (например, AWS Lambda ), если вы предпочитаете начинать с этого подхода.

Мое приложение написано на Python и подается через Flask в локальную конечную точку (http://localhost:5000) на что указывает нгрок . Затем у меня есть IFTTT webhook , нажав на URL-адрес Ngrok после нажатия виджета кнопки IFTTT с моего телефона. Приложение в конечном итоге транслирует вывод на мою учетную запись Slack, поэтому я получаю push-уведомление на свой телефон, содержащее вывод приложения в течение нескольких секунд после нажатия кнопки:

Уведомление о слабине.png

Опять же, все бесплатные инструменты (Flask, ngrok, IFTTT и Slack), и я использую девятилетний Mac, который я использую только для легкого просмотра веб-страниц, потоковой передачи и базовых программных проектов. Таким образом, я смог использовать существующее оборудование.

Краткая схема всего потока:

Блок-схема приложения.png

Виджет кнопки IFTTT

Вот кнопка, которую я нажимаю на главном экране своего iPhone, чтобы запустить приложение:

Кнопка IFTTT widget.jpg

В iOS виджет кнопки IFTTT очень прост в настройке. Я только что вставил URL-адрес ngrok, настроенный на моем локальном компьютере для запуска приложения:

IFTTT webhook config.jpg

Нгрок

На моем Mac я включаю ngrok, запустив:

./ngrok http 5000

Это предоставляет мне URL-адрес, который мне нужно использовать с IFTTT. Просто имейте в виду, что если вы не находитесь на платном плане ngrok, каждый раз, когда вы перезагружаете компьютер (или просто выходите и снова запускаете ngrok), у вас будет новый URL-адрес для вставки в IFTTT. Это может быть раздражающей вещью через некоторое время, но ключ здесь бесплатный .

Колба

Запустить Flask так же просто, как указать локальную конечную точку, которую вы хотите запустить в приложении:

@app.route('/ynab-balances')
def run():
  runYnabAccountBalanceCheck()
  return "Done"

Затем в терминале вы можете запустить приложение, чтобы оно ожидало запросов:

$ python3 my_ynab_balances.py
 * Serving Flask app "my_ynab_balances" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Слабина

Мой скрипт Python использует клиент Slack API для трансляции всего, что я хочу, в свою учетную запись Slack:

def send_to_slack(self, output):
  self.slackClient.chat_postMessage(channel='@Matt', text=output)

Я настроил его для отправки выходных данных приложения на мое собственное имя пользователя Slack, которое заканчивается как личное сообщение для меня.

Развертывание Новых Изменений Кода

Когда я делаю обновления для приложения, я нажимаю на Github, а затем вручную запускаю git pull на своем Mac, чтобы получить последние изменения. Это требует, чтобы я либо физически находился перед моим Mac, либо использовал приложение VNC (например, Screens ) для удаленного управления моим Mac. В любом случае это утомительно. Мой следующий план состоит в том, чтобы создать простое задание cron, которое периодически извлекает последний код.