Webhooks在运行应用程序之间,发生的大部分功能被称为“魔术”表演。它们有时被称为反向API,回调甚至通知。那么如何使用Python收听Webhooks?Python在许多服务中都可以见到,例如SendGrid,Stripe,Slack和GitHub,都使用事件将Webhooks发送为其API的一部分。这使您的应用程序可以侦听事件并在事件发生时执行操作。
本指南假定您在计算机上安装了Python v3。您可以在官方下载页面上找到有关安装python的详细信息 。根据您的设置, python 您要使用的命令可能是 python3。
您可以通过从终端运行以下命令来确认安装的版本:
python --version
或者,如果显示的版本低于3:
python3 --version
什么是网络挂钩
Webhooks之所以称为反向API,是有原因的。API会将请求发送到您的应用程序,而不是您的应用程序向API发送请求。虽然这个概念听起来可能不同,但是我们使用Webhook的方式与API使用请求的方式相同。
在大多数Web框架中,都有路由的概念。路由允许应用程序在用户访问特定URL时以特定内容或数据进行响应。同样的想法也适用于API。
当您向GitHub发送有关特定组织的详细信息的请求时,例如 Bearer,路线是 /orgs/:org 哪里 :org 是组织的名称。
接收Webhook时应用相同的概念。我们建立一条路由,告诉服务将数据发送到哪里,然后我们的应用程序就坐下来等待,直到对该路由发出请求。Webhook实现中存在一些一致性。
他们通常是 POST 要求。
他们接收JSON数据。
他们需要迅速做出反应。
某些API将要求您的应用程序在一定时间内做出响应,否则将重新发送该事件。例如, Slack API 希望在三秒钟内返回响应。
使用Flask接收Webhook
该 瓶框架 是一个轻量级的Python Web框架,把自己描述为“微”。这样一来,您就可以使用所需的内容,然后随着项目的增长添加更多的结构。
就我们的目的而言,这很好,因为我们只关心路由。确保已安装Python,然后在终端中运行以下命令来安装flask:
python -m pip install Flask
您可以在Flask文档中找到完整的安装和设置详细信息 。
接下来,创建一个 .py 文件,例如 main.py 并添加以下内容:
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def respond():
print(request.json);
return Response(status=200)
此代码将Flask类以及request和Response对象导入。然后使用名称实例化它 __name__ 在将其分配给 app 变量。该命名方案是Flask文档中的约定。
接下来,我们使用 @app.route 装饰者倾听 POST 针对 /webhook 路径。当对路由提出请求时,此装饰器调用紧随其后的函数。在这种情况下, respond 功能。
就本例而言,我们 print 将请求作为json发送,然后返回 Response 状态代码为200。此响应告诉发送者我们已收到该挂钩。您应该能够使用Flask的首选技术来运行服务器:
export FLASK_APP=main.py
python -m flask run
就是这样!现在,我们有了一个应用程序,该应用程序使用python和flask监听webhook。部署后, POST 向端点发出的请求将触发 respond 功能。
例如:webhook. 这也是您将提供发送Webhook服务的URL。
接收Django的Webhook
在Django中设置应用程序要比Flask自动化得多,但这也带来了更精细的文件结构。作为更传统的模型-视图-控制器(MVC)框架,Django为您提供了该项目的主要部分。完整的安装指南可在 官方的Django文档页面上找到,但也可以通过以下方式安装 pip 使用以下命令:
python -m pip install Django
如果您是从头开始建立专案,请使用 django-admin 实用程序来创建一个新项目。如果您已有要添加Webhooks的Django项目,请跳至下一步。
django-admin startproject example-project
这为新的Django项目奠定了基础。导航到新创建的文件夹,您将看到类似于以下内容的结构:
example-project/
manage.py
example-project/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
我们可以通过运行来确认一切正常 python manage.py runserver。
Django的惯例是在此外部“项目”中设置“应用”。您可以避免这种情况,并通过运行来设置一个单应用程序项目 django-admin startproject example-project .尾随句点(。)代替。对于本教程,我们将镜像首选的方式,如前所示。
为此,我们将设置一个名为webhooks的“应用程序” 。
python manage.py startapp webhooks
这将创建一个名为webhooks的新目录 。现在我们可以编写一些代码。
我们将专注于三个文件: webhooks/views.py, webhooks/urls.py (尚未创建),以及 example-site/urls.py。
开启档案 webhooks/views.py。在这里,我们将编写处理路线的逻辑。
from django.http import HttpResponse
from django.views.decorators.http import require_POST
@require_POST
def example(request):
return HttpResponse('Hello, world. This is the webhook response.')
此代码执行以下操作:
它导入 HttpResponse 用于发送响应的对象。
它导入一个特殊的装饰器以限制请求方法。在Django中,路由默认情况下接受所有HTTP方法,并让视图管理它们响应的方法。
调用装饰器,将其后的功能限制为仅 POST 方法。
定义一个函数,名为 example 将请求作为参数并返回响应。
这个 example 函数的名称将链接到我们的 urls.py 尽快归档。它不需要与特定路径对齐。
接下来,建立 webhooks/urls.py 如果尚不存在。这是我们在项目的此子应用程序内组织路线的地方。
from django.urls import path
from . import views
urlpatterns = [
path('example/', views.example)
]
在这里,我们导入 path 从 django.urls。它定义了各个路线,并将它们与视图关联。接下来,我们导入所有视图。
最后, urlpatterns 被传递路径列表。Django将此列表识别为与应用程序关联的路由。
在这种情况下,我们定义了以 example/ 并与视图关联 views.example,这是我们函数的名称 views.py。
完成此操作后,我们的应用程序可以运行,但是我们需要将其告知外部项目。打开 example-project/urls.py。它看起来应该与先前的文件相似,但是已经存在 admin 路线。像这样添加新路径:
urlpatterns = [
path('admin/', admin.site.urls),
path('webhooks/', include('webhooks.urls'))
]
如果您的服务器已停止,请使用 python manage.py runserver。
现在尝试向发出POST请求 /example/(如果不同,请用您自己的主机和端口替换)。
这样,我们就建立了一个Django项目,该项目监听一个Webhook /webhooks/example。部署后,将此路径附加到完整URL上,并将完整URL提供给发送Webhook的服务。
在本地测试Webhooks
要在本地进行Webhooks的测试而不进行部署,我们需要打开从开发机器到外界的连接。
一种选择是使用 ngrok。通过此服务,您可以提供对本地计算机上特定端口的外部访问。这非常适合我们的需求。首先,请注册并按照安装和入门说明进行操作。
完成后,如果您使用的是MacOS,则应该可以运行 ./ngrok http 3000 在将3000替换为正在运行的Python应用程序的端口的终端中。例如,默认的Django站点通常在端口8000上运行。
一旦启动并运行,ngrok将为您提供一个可用于测试Webhook的URL。在Bearer中,我们在通知设置中提供了“测试”按钮。
配置完成后,您将开始在该URL接收webhook。开发和测试完成后,请不要忘记将其更改为最终部署的Webhook URL。
您可以使用此信息做什么?
一旦配置了Webhook,则取决于您如何处理它收到的信息。您可以使用此信息对事件进行实时响应,使应用程序的功能翻转,甚至可以将其用作将数据写入数据库的方式。您的Webhook可以具有无数种功能,具体取决于API提供程序发送的信息类型。
尽管我们在本文中构建了一个基本的实现,但是值得一提的是,许多服务都提供了验证请求是否来自实际来源的方法。这可以通过限制访问您的应用程序的URL或通过匹配密钥来完成。例如,GitHub允许您设置将随每个Webhook发送的秘密。
以上就是关于如何使用Python收听Webhooks的全部内容介绍,想了解更多关于Python的信息,请继续关注。