Python和瓶
本教程将向你展示如何使用Lokalise Python SDK来创建webhook,在第三方应用程序中监听webhook事件,并处理传入的通知。
在本教程中,您将学习如何……
- 使用Lokalise API令牌
- 使用Lokalise API创建webhook
- 收听webhooks事件
- 处理传入的通知
你可以在GitHub上找到源代码.
先决条件
本指南假设您有一个Lokalise项目(如果没有,学习如何创建你的Lokalise项目在这里).此外,您还需要一个读/写Lokalise API令牌;你可以学习如何得到一个在相应的文章中.
如果你想在你的电脑上本地执行本指南,你需要安装以下软件:
- Python(版本3.7或以上)
- 代码编辑器
- Heroku CLI
最后,请注意,为了监听和响应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为你注册了:
![2022-05-05 15_52_44-My Web App _ Lokalise — Mozilla Firefox.png 1104](https://files.readme.io/3f99df3-2022-05-05_15_52_44-My_Web_App___Lokalise__Mozilla_Firefox.png)
![Click to close... 1104](https://files.readme.io/3f99df3-2022-05-05_15_52_44-My_Web_App___Lokalise__Mozilla_Firefox.png)
注意“X-Secret header”隐藏值。你可以在你的应用中使用这个值,并将它与发送给通知
路由进行额外的保护(从而过滤恶意请求)。
返回Lokalise项目编辑器并创建一个新的翻译键。重新加载页面,确保密钥被隐藏:
![2022-05-05 16_00_24-My Web App _ Lokalise — Mozilla Firefox.png 296](https://files.readme.io/b865274-2022-05-05_16_00_24-My_Web_App___Lokalise__Mozilla_Firefox.png)
![Click to close... 296](https://files.readme.io/b865274-2022-05-05_16_00_24-My_Web_App___Lokalise__Mozilla_Firefox.png)
点击“Comments”按钮(上面屏幕上的第一个按钮),确保注释显示正确:
![2022-05-05 16_00_34-My Web App _ Lokalise — Mozilla Firefox.png 536](https://files.readme.io/7edd9fe-2022-05-05_16_00_34-My_Web_App___Lokalise__Mozilla_Firefox.png)
![Click to close... 536](https://files.readme.io/7edd9fe-2022-05-05_16_00_34-My_Web_App___Lokalise__Mozilla_Firefox.png)
就是这样,干得好!
更新<!-- --> 4个月前<!-- -->