如何在Ubuntu16.04上使用Flask和Python3编写斜线命令

来自菜鸟教程
跳转至:导航、​搜索

介绍

Slack 是团队的交流平台。 Slack 有许多附加组件,可让团队扩展 Slack,并将其与其他程序集成。 Slack 斜线命令 是在消息输入框中执行操作的一种快速简便的方法。 例如,键入 /who 会列出当前频道中的所有用户。 您可以在 https://get.slack.help/hc/en-us/articles/201259356-Slash-commands 找到内置斜杠命令的完整列表。

您可以创建自己的斜杠命令,您的 Slack 工作区的成员会觉得这些命令很有用。 当您将命令安装到工作区并调用命令时,您可以指示 Slack 向您编写的程序发出请求。 该程序从 Slack 接收信息并返回响应,该响应显示在 Slack 中。 您可以通过阅读 API 文档 了解有关 Slack 斜杠命令的更多信息。

在本教程中,您将创建一个名为 /slash 的 Slack 斜杠命令,该命令由在 Ubuntu 16.04 服务器上运行的 Flask 应用程序提供支持,并将此命令安装到您的 Slack 工作区。 完成后,在消息输入框中键入 /slash 会将信息发送到 Flask 应用程序,该应用程序将处理请求并向 Slack 返回一条短消息,让您知道它有效。

您将使用 uWSGI 应用服务器为这个 Flask 应用程序提供服务,并使用 Nginx 作为反向代理。

先决条件

要完成本教程,您需要:

第 1 步 - 创建和安装 Slack 应用程序

在我们编写代码之前,我们将首先创建一个 Slack 应用程序,它为 Slack 提供附加功能,并将其安装在开发 Slack 工作区中。 然后我们将定义命令并指定在调用命令时该命令应请求的 URL。

要创建 Slack 应用程序,请访问 https://api.slack.com/apps 并单击绿色的 创建新应用程序 按钮。 在出现的表格中,输入以下详细信息:

  • 对于 应用名称,输入 DigitalOcean Slack slash command
  • 对于 Development Slack Workspace,选择您的开发工作区。

然后点击绿色的Create App按钮。

创建应用程序后,单击 Slash Commands,然后单击 Create New Command 按钮。 您将看到以下页面:

在本教程中,您将创建一个名为 /slash 的命令,它将通过 HTTP POST 将数据发送到请求 URL,即 http://server_domain_or_IP/slash。 为此,请填写以下信息:

然后在绿色的 Save 按钮上完成创建斜杠命令。

现在通过单击 Install App 链接将应用程序安装到您的工作区。 按绿色的 Install App to Workspace 按钮。 然后按下绿色的 Authorize 按钮。

我们现在已经在开发 Slack 工作区中创建并安装了一个 Slack 应用程序。但是在我们创建一个处理斜杠命令的 Web 应用程序之前,该命令将不起作用。 在我们构建应用程序之前,我们需要配置我们的 Python 环境。

第 2 步 — 配置 Python 环境

完成 如何在 Ubuntu 16.04 上使用 uWSGI 和 Nginx 服务 Flask 应用程序教程后,您在 ~/myproject/ 中拥有一个 Flask 应用程序。 该目录包含以下文件和目录:

  • myproject.ini
  • myproject.py
  • wsgi.py
  • myprojectenv/

我们将修改 myproject.py 中的 Flask 应用程序,以对 Slack 斜杠命令发送的数据进行操作,并向 Slack 返回 JSON 响应。

命令 API 文档指出,我们应该使用 Slack 提供的与命令关联的验证令牌来验证斜杠命令。

此验证令牌应保密,因此我们将其保存在一个名为 .env 的新文件中,该文件不受版本控制。 我们将使用 python-dotenv 包将 .env 中的键值对导出为环境变量,我们将在 myproject.py 中访问这些环境变量。

首先,通过运行以下命令激活 Python 虚拟环境:

source myprojectenv/bin/activate

要确认 virtualenv 已激活,您应该在 Bash 提示符的左侧看到 (myprojectenv)。 验证令牌等机密不应存储在版本控制之下。 为此,我们使用 python-dotenv 包将机密导出为环境变量。 使用 pip,我们安装 python-dotenv 包:

pip install python-dotenv

使用 nano 或您喜欢的文本编辑器,创建 .env 文件:

nano .env

访问 https://api.slack.com/apps 获取验证令牌。 单击 DigitalOcean Slack 斜杠命令 应用程序,然后单击 基本信息。 然后找到验证令牌

复制令牌的值并将其放在 .env 文件中,将值分配给名为 VERIFICATION_TOKEN 的环境变量:

~/myproject/.env

VERIFICATION_TOKEN=your_verification_token

保存文件并退出编辑器。

当您开发 Flask 应用程序时,您会希望 uWSGI 服务器在您对应用程序进行更改时自动重新加载。 为此,首先在编辑器中打开 myproject.ini

nano myproject.ini

将此行添加到文件末尾以确保当您 touch 或在 myproject.py 中修改 Flask 应用程序时 uWSGI 自动重新加载

~/myproject/myproject.ini

...

touch-reload = myproject.py

保存文件并退出编辑器。

现在我们将创建 Flask 应用程序,它接收和处理斜杠命令发送的信息,并向 Slack 返回适当的响应。

第 3 步 - 创建 Flask 应用程序

当我们在 Slack 中调用 /slash 命令时,Slack 会向我们的服务器发出请求。 我们将命令配置为点击 url /slash,因此我们将更改我们创建的 Flask 应用程序以响应该端点。

在编辑器中打开 myproject.py

nano myproject.py

删除文件的内容。 我们将从头开始创建一个新应用程序。

添加此代码,该代码导入 Flask 并加载用于处理 JSON 数据和发出 Web 请求的附加模块:

~/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 斜杠命令,方法是发送一条文本响应“DigitalOcean Slack 斜杠命令成功!”:

~/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()

保存文件并退出编辑器。

重新启动 myproject systemd 服务以确保最新版本的代码正在运行:

sudo systemctl restart myproject

现在让我们修改 Nginx 配置以支持我们的斜杠命令。

第 4 步 – 配置 Nginx 以服务于命令

因为我们的请求 URL 是 http://server_domain_or_IP/slash,我们需要将 Nginx 服务器块中的 location 值从 / 更改为 /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。 您应该看到以下响应:

如果您收到说明命令失败的消息,请仔细检查 myproject.py 中的代码是否有任何语法错误或问题。 然后再试一次。

最后,一旦您完成了命令的开发,请停用 Python 虚拟环境,以便将来的 Python 命令使用系统 Python 解释器:

deactivate

您现在已经成功创建了一个 Flask 应用程序,该应用程序从 /slash 斜杠命令接收信息并向 Slack 返回响应。

为确保您的服务器和 Slack 之间的通信安全,请使用 HTTPS 为请求 URL 加密斜杠命令的连接。 您可以通过 在 Nginx 服务器 上安装 Let's Encrypt 颁发的免费 SSL 证书来实现。 完成后,请务必修改 Slack 应用程序的 URL,并将 http:// 更改为 https://


结论

在本教程中,您通过设置由 uWSGI 应用程序服务器和 Nginx 反向代理服务器提供服务的 Flask 应用程序来实现 Slack 斜杠命令。

现在您已经了解了创建斜线命令的基础知识,您可以实现团队需要的任何斜线命令。 您可以创建从数据库中检索数据、与其他 API 交互的命令,甚至可以创建用于部署代码的命令。