Python和瓶

本教程将向你展示如何使用Lokalise Python SDK来创建webhook,在第三方应用程序中监听webhook事件,并处理传入的通知。

在本教程中,您将学习如何……

  • 使用Lokalise API令牌
  • 使用Lokalise API创建webhook
  • 收听webhooks事件
  • 处理传入的通知

你可以在GitHub上找到源代码

先决条件

本指南假设您有一个Lokalise项目(如果没有,学习如何创建你的Lokalise项目在这里).此外,您还需要一个读/写Lokalise API令牌;你可以学习如何得到一个在相应的文章中

如果你想在你的电脑上本地执行本指南,你需要安装以下软件:

最后,请注意,为了监听和响应webhook事件,你的应用程序必须是公开可访问的。在本教程中,我们将部署我们的应用程序到Heroku(见下文)。

我们要建造什么

我们将创建一个简单的应用程序,允许用户在他们的Lokalise项目中注册webhook。该应用程序还将侦听由这些webhook生成的传入通知,并通过发送API请求对它们做出反应。

准备一款新应用

首先,让我们在应用的根目录中创建一个虚拟环境,并通过运行以下命令安装Flask、Gunicorn和Python SDK:

python -m venv venv。venv/bin/activate pip install Flask gunicorn python-lokalise-api

如果你在Windows上,运行:

py -3 -m venv venv venv\脚本\激活pip安装Flask gunicorn python-lokalise-api

创建一个Procfile在项目根目录中包含以下内容:

网络:gunicorn wsgi:应用程序

这个文件将被Heroku用来正确启动我们的应用程序。如果您正在使用另一个托管平台,您可能需要使用不同的方法。

接下来,创建一个runtime.txt带有Python版本的文件:

python-3.10.4

创建一个名为wsgi.py

从app.main导入app if __name__ == "__main__": app.run()

现在创建一个名为应用程序与一个main.py文件:

from flask import flask, render_template, request, redirect, url_for, flash app = flask (__name__, template_folder='../templates') app.secret_key = b'_5#y2L"F4Q8z\n\xec]/' @app.route("/") def home(): return render_template('home.html')

请注意app.secret_key应该足够长,而且应该私下保存。

让我们添加一个模板。创建一个模板/ home。文件:

<!html doctype html > < lang = "恩" > <头> <标题>注册一个webhook < /名称> < /头> <身体> < h1 >注册一个webhook h1 > < /{%消息= get_flashed_messages() %}{%如果消息%}< ul类=闪光>{%的消息消息%}<李>{{消息}}< /李> {% endfor %} < / ul > {% endif %} {% endwith %} < action = " /人”方法形式=“POST”> <标签=“project_id”>输入Lokalise项目ID: < /标签> < input type = " text " name = " project_id " ID = " project_id " > < input type = "提交"价值= "注册" > < / >形式< /身体> < / html >

我们还要加上a.gitignore文件到项目的根目录:

venv / .env app / __pycache__

现在你可以运行:

PIP freeze > requirements.txt git init git add。Git commit -m "first commit"

然后登录Heroku,创建一个新的应用程序,部署并打开:

登录heroku创建YOUR_APP_NAME git推送heroku master打开

伟大的工作!现在一切都准备好了,让我们继续本教程的主要部分。

存储Lokalise API令牌

为了与Lokalise API交互,您需要一个特殊的令牌。或者,您也可以实现OAuth 2流相应的文章并代表用户行事。

令牌不应该公开,因此让我们将其存储在.env已添加的文件.gitignore

abc LOKALISE_API_TOKEN = 123

我们将使用python-dotenv包来处理环境变量,因此要安装它:

pip安装python-dotenv

开放app / main.py,加载所有必要的模块,并创建一个新的方法来创建Lokalise API客户端:

Import OS Import lokalise from dotenv Import load_dotenv load_dotenv() #…def __client():返回lokalisise . client(os.getenv('LOKALISE_API_KEY'))

要在Heroku上添加一个新的环境变量,运行:

heroku配置:添加LOKALISE_API_KEY = 123 abc

登记人

现在让我们添加一个方法在Lokalise上注册一个webhook。这是一个常见的模式,当第三方应用程序注册所需的webhook,然后监听传入的事件。

我们已经添加了一个表单来输入项目ID,因此添加了一个handler方法:

@app。route('/webhooks', methods=['POST']) def webhooks(): __client().create_webhook(request. webhook):形式(“project_id”),{“url”:os.getenv(“NOTIFY_URL”),“事件”:[" project.key。添加了"]})返回重定向(url_for('home'))

在这个例子中,我们将收听单个事件:project.key.added.然而,还有更多的事件可以订阅。你可以在我们的人医生

我们也用aNOTIFY_URL环境变量,该变量应该包含Heroku上的应用程序URL/通知路径:

NOTIFY_URL = https://YOUR_HEROKU_URL/notify

确保将这个环境变量添加到Heroku:

heroku配置:添加NOTIFY_URL = https://YOUR_HEROKU_URL/notify

你的应用程序必须是公开可访问的

如果你在本地运行你的Flask应用程序(python wsgi.py),并提供localhost: 5000 /通知作为一个通知URL,它将不可能注册Lokalise webhook。这是因为Lokalise向提供的URL发送一个特殊的“ping”请求,并期望收到2xx状态码。如果URL不可访问,webhook将不会被创建。

回复通知

接下来我们要加一个通知路由和监听传入的通知。例如,每次创建一个键,我想添加一个键的评论(这将显示在Lokalise项目聊天),并隐藏这个键,使它只对项目管理员可见。当然,你可以根据需要执行任何其他操作:

@app。route('/notify', methods=['POST']) def notify(): data = request.get_json() if data != ['ping'] and data['event'] == '项目。添加”:__client()。create_key_comments(data['project']['id'], data['key']['id'], [{"comment": "@Bob请仔细检查这个新添加的键!"}]) __client()。update_key(数据(“项目”)(“id”),数据(“关键”)(“id”),{“is_hidden”:真})返回",200年

Webhook数据以JSON格式发送。我们确保接收到的通知不是ping,并且具有正确的事件名称。然后我们只需添加一个键注释并使用事件的数据更新键。

请注意,您的事件处理程序必须响应POST请求并返回2xx状态码。否则,Lokalise将认为webhook通知不成功,并尝试多次重新发送失败的通知。

测试出来

现在一切准备就绪!的方法冻结需求PIP冻结> requirements.txt命令并将你的代码发送给Heroku。运行heroku开放,在文本输入框中输入Lokalise项目ID,然后按“Register”。

然后打开Lokalise,进入你的项目,点击顶部菜单中的“Apps”。找到“Webhooks”应用程序,点击它,然后按“管理”。你会看到一个新的webhook为你注册了:

11041104

注意“X-Secret header”隐藏值。你可以在你的应用中使用这个值,并将它与发送给通知路由进行额外的保护(从而过滤恶意请求)。

返回Lokalise项目编辑器并创建一个新的翻译键。重新加载页面,确保密钥被隐藏:

296296

点击“Comments”按钮(上面屏幕上的第一个按钮),确保注释显示正确:

536536

就是这样,干得好!


这个页面对你有帮助吗?