Как написать команду слеша с Flask и Python 3 в Ubuntu 16.04

Вступление

Slack - это коммуникационная платформа для команд. Slack имеет множество дополнений, которые позволяют командам расширять Slack и интегрировать его с другими программами. Slackslash commands - это быстрый и простой способ выполнять действия в поле ввода сообщения. Например, при вводе/who будут перечислены все пользователи текущего канала. Вы можете найти полный список встроенных команд с косой чертой вhttps://get.slack.help/hc/en-us/articles/201259356-Slash-commands.

Вы можете создавать свои собственные команды слеша, которые члены вашей рабочей области Slack считают полезными. Когда вы устанавливаете команду в свое рабочее пространство и вызываете ее, вы можете указать Slack сделать запрос к программе, которую вы написали. Эта программа получает информацию из Slack и возвращает ответ, который отображается в Slack. Вы можете узнать больше о командах Slack с косой чертой, прочитавAPI documentation.

В этом руководстве вы создадите команду Slack с косой чертой под названием/slash на базе приложенияFlask, работающего на сервере Ubuntu 16.04, и установите эту команду в рабочее пространство Slack. Когда вы закончите, набрав/slash в поле ввода сообщения, информация будет отправлена ​​в приложение Flask, которое обработает запрос и вернет короткое сообщение в Slack, сообщая вам, что это сработало.

Вы будете обслуживать это приложение Flask с помощью сервера приложенийuWSGI и использоватьNginx в качестве обратного прокси.

Предпосылки

Для завершения этого урока вам понадобится:

  • Один сервер Ubuntu 16.04, настроенный следующим образомthe Ubuntu 16.04 initial server setup guide, включая пользователя sudo без полномочий root и брандмауэр.

  • Существующее приложение Flask, обслуживаемое uWSGI, работает за Nginx. Завершите руководствоHow To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04, чтобы настроить это на своем сервере.

  • Рабочее пространство Slack для разработки с разрешением на установку приложений. Если у вас его нет, создайте его наhttps://slack.com/create.

[[step-1 -—- create-and-install-the-slack-app]] == Шаг 1. Создание и установка приложения Slack

Прежде чем писать код, мы сначала создадимSlack app, который обеспечивает дополнительную функциональность для Slack, и установим его в рабочей области Slack для разработки. Затем мы определим команду и укажем URL-адрес, который должна запрашивать команда при ее вызове.

Чтобы создать приложение Slack, посетитеhttps://api.slack.com/apps и нажмите зеленую кнопкуCreate New App. В появившейся форме введите следующие данные:

  • ДляApp Name введитеDigitalOcean Slack slash command.

  • ДляDevelopment Slack Workspace выберите рабочую область разработки.

Затем нажмите зеленую кнопкуCreate App.

После создания приложения щелкнитеSlash Commands, а затем нажмите кнопкуCreate New Command. Вы увидите следующую страницу:

Page for creating new command.

В этом руководстве вы создадите команду под названием/slash, которая будет отправлять данные через HTTP POST на URL-адрес запросаhttp://server_domain_or_IP/slash. Для этого заполните следующую информацию:

  • Заполните полеCommand с помощью/slash.

  • ДляRequest URL введитеhttp://your_server_ip_or_domain/slash.

  • ДляShort Description введитеDigitalOcean Slack slash command.

Затем нажмите зеленую кнопкуSave, чтобы завершить создание команды косой черты.

Теперь установите приложение на свое рабочее место, щелкнув ссылкуInstall App. Нажмите зеленую кнопкуInstall App to Workspace. Затем нажмите зеленую кнопкуAuthorize.

Теперь мы создали и установили приложение Slack в рабочем пространстве разработки Slack., Но команда не будет работать, пока мы не создадим веб-приложение, которое обрабатывает команду слэша. Прежде чем мы сможем создать приложение, нам нужно настроить вашу среду Python.

[[step-2 -—- configuring-the-python-environment]] == Шаг 2. Настройка среды Python

После завершения обученияHow To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04 у вас будет приложение Flask, расположенное в~/myproject/. Этот каталог содержит следующие файлы и каталог:

  • myproject.ini

  • myproject.py

  • wsgi.py

  • myprojectenv/

Мы изменим приложение Flask вmyproject.py, чтобы оно действовало на данные, отправленные командой Slack с косой чертой, и возвращало ответ JSON в Slack.

API documentation for commands указывает, что мы должны проверить команду косой черты, используя токен проверки, связанный с командой, предоставленный Slack.

Этот токен подтверждения должен храниться в секрете, поэтому мы сохраним его в новом файле с именем.env file, который не находится под контролем версий. Мы будем использовать пакетpython-dotenv для экспорта пар ключ-значение в.env в качестве переменных среды, и мы получим доступ к этим переменным среды вmyproject.py.

Сначала активируйте виртуальную среду Python, выполнив:

source myprojectenv/bin/activate

Чтобы подтвердить, что virtualenv активирован, вы должны увидеть(myprojectenv) в левой части командной строки Bash. Такие секреты, как проверочный токен, не должны храниться под контролем версий. Для этого мы используем пакетpython-dotenv, который экспортирует секреты как переменные среды. Используяpip, мы устанавливаем пакетpython-dotenv:

pip install python-dotenv

Используя nano или ваш любимый текстовый редактор, создайте файл.env:

nano .env

Получите токен подтверждения, посетивhttps://api.slack.com/apps. Щелкните приложениеDigitalOcean Slack slash command, затем щелкнитеBasic Information. Затем найдитеVerification Token.

The verification token

Скопируйте значение токена и поместите его в файл.env, присвоив значение переменной среды с именемVERIFICATION_TOKEN:

~/myproject/.env

VERIFICATION_TOKEN=your_verification_token

Сохраните файл и выйдите из редактора.

Когда вы разрабатываете приложение Flask, вы хотите, чтобы сервер uWSGI автоматически перезагружался при внесении изменений в приложение. Для этого сначала откройтеmyproject.ini в редакторе:

nano myproject.ini

Добавьте эту строку в конец файла, чтобы убедиться, что uWSGI автоматически перезагружается, когда выtouch или изменяете приложение Flask вmyproject.py

~/myproject/myproject.ini

...

touch-reload = myproject.py

Сохраните файл и выйдите из редактора.

Теперь мы создадим приложение Flask, которое получает и обрабатывает информацию, отправленную командой slash, и возвращает соответствующий ответ Slack.

[[step-3 -–- created-the-flask-app]] == Шаг 3. Создание приложения Flask

Когда мы вызываем команду/slash в Slack, Slack отправляет запрос нашему серверу. Мы настроили команду для обращения к URL-адресу/slash, поэтому мы изменим созданное приложение Flask для ответа на эту конечную точку.

Откройтеmyproject.py в своем редакторе:

nano myproject.py

Удалите содержимое файла. Мы создадим новое приложение с нуля.

Добавьте этот код, который импортирует Flask и загружает дополнительные модули для обработки данных JSON и выполнения веб-запросов:

~/myproject/myproject.py

#!/usr/bin/env python

from flask import Flask, jsonify, request

Затем добавьте этот код, который загружает модульdotenv. читает содержимое созданного вами файла.env. загружает свое содержимое в переменные среды, а затем извлекает токен проверки из среды, сохраняя его в переменнойverification_token:

~/myproject/myproject.py

...
import os
import dotenv


dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
dotenv.load_dotenv(dotenv_path)
verification_token = os.environ['VERIFICATION_TOKEN']

Теперь добавьте этот код, чтобы сконфигурировать приложение Flask для ответа на команду Slack slash, отправив текстовый ответ, который говорит: «Команда DigitalOcean Slack slash успешна!»:

~/myproject/myproject.py

...

app = Flask(__name__)

@app.route('/slash', methods=['POST'])
def slash():
    if request.form['token'] == verification_token:
        payload = {'text': 'DigitalOcean Slack slash command is successful!'}
        return jsonify(payload)


if __name__ == '__main__':
    app.run()

Сохраните файл и выйдите из редактора.

Перезапустите службу systemdmyproject, чтобы убедиться, что работает последняя версия вашего кода:

sudo systemctl restart myproject

Теперь давайте изменим конфигурацию Nginx для поддержки нашей команды slash.

[[step-4 -–- configuring-nginx-to-serve-the-command]] == Шаг 4 - Настройка Nginx для обслуживания команды

Поскольку наш URL-адрес запроса -http://server_domain_or_IP/slash, нам нужно изменить значениеlocation в нашем серверном блоке Nginx с/ на/slash.

Откройте файл/etc/nginx/sites-available/myproject в вашем редакторе:

sudo nano /etc/nginx/sites-available/myproject

Измените значениеlocation с/ на/slash:

/etc/nginx/sites-available/myproject

...

    location /slash {
        include uwsgi_params;
        uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
    }
}

Сохраните файл и выйдите из редактора.

Затем проверьте файл конфигурации Nginx на наличие синтаксических ошибок:

sudo nginx -t

Если в файле конфигурации Nginx нет синтаксических ошибок, перезапустите службу Nginx:

sudo systemctl restart nginx

Посетите рабочее пространство Slack для разработки и введите/slash в любом канале. Вы должны увидеть следующий ответ:

Slack slash command is successful!

Если вы получили сообщение о том, что команда не выполнена, дважды проверьте код вmyproject.py на наличие синтаксических ошибок или проблем. Тогда попробуйте еще раз.

Наконец, как только вы закончите разработку своей команды, деактивируйте виртуальную среду Python, чтобы будущие команды Python использовали системный интерпретатор Python:

deactivate

Вы успешно создали приложение Flask, которое получает информацию от команды косой черты/slash и возвращает ответ Slack.

[.note] # Чтобы обеспечить безопасность связи между вашим сервером и Slack, зашифруйте соединение для команды с косой чертой, используя HTTPS для URL-адреса запроса. Вы можете сделать этоinstalling a free SSL certificate issued by Let’s Encrypt on the Nginx server. Когда вы закончите, не забудьте изменить URL-адрес своего приложения Slack и заменитьhttp:// наhttps://.
#

Заключение

В этом руководстве вы реализовали команду Slack slash, настроив приложение Flask, которое обслуживается сервером приложений uWSGI и обратным прокси-сервером Nginx.

Теперь, когда вы знаете основы создания команд косой черты, вы можете реализовать любую команду косой черты, которая нужна вашей команде. Вы можете создавать команды, которые извлекают данные из баз данных, взаимодействовать с другими API или даже создавать команды для развертывания кода.

Related