Webhooks在運行應(yīng)用程序之間,發(fā)生的大部分功能被稱為“魔術(shù)”表演。它們有時被稱為反向API,回調(diào)甚至通知。那么如何使用Python收聽Webhooks?Python在許多服務(wù)中都可以見到,例如SendGrid,Stripe,Slack和GitHub,都使用事件將Webhooks發(fā)送為其API的一部分。這使您的應(yīng)用程序可以偵聽事件并在事件發(fā)生時執(zhí)行操作。
本指南假定您在計算機上安裝了Python v3。您可以在官方下載頁面上找到有關(guān)安裝python的詳細信息 。根據(jù)您的設(shè)置, python 您要使用的命令可能是 python3。
您可以通過從終端運行以下命令來確認安裝的版本:
python --version
或者,如果顯示的版本低于3:
python3 --version
什么是網(wǎng)絡(luò)掛鉤
Webhooks之所以稱為反向API,是有原因的。API會將請求發(fā)送到您的應(yīng)用程序,而不是您的應(yīng)用程序向API發(fā)送請求。雖然這個概念聽起來可能不同,但是我們使用Webhook的方式與API使用請求的方式相同。
在大多數(shù)Web框架中,都有路由的概念。路由允許應(yīng)用程序在用戶訪問特定URL時以特定內(nèi)容或數(shù)據(jù)進行響應(yīng)。同樣的想法也適用于API。
當(dāng)您向GitHub發(fā)送有關(guān)特定組織的詳細信息的請求時,例如 Bearer,路線是 /orgs/:org 哪里 :org 是組織的名稱。
接收Webhook時應(yīng)用相同的概念。我們建立一條路由,告訴服務(wù)將數(shù)據(jù)發(fā)送到哪里,然后我們的應(yīng)用程序就坐下來等待,直到對該路由發(fā)出請求。Webhook實現(xiàn)中存在一些一致性。
他們通常是 POST 要求。
他們接收JSON數(shù)據(jù)。
他們需要迅速做出反應(yīng)。
某些API將要求您的應(yīng)用程序在一定時間內(nèi)做出響應(yīng),否則將重新發(fā)送該事件。例如, Slack API 希望在三秒鐘內(nèi)返回響應(yīng)。
使用Flask接收Webhook
該 瓶框架 是一個輕量級的Python Web框架,把自己描述為“微”。這樣一來,您就可以使用所需的內(nèi)容,然后隨著項目的增長添加更多的結(jié)構(gòu)。
就我們的目的而言,這很好,因為我們只關(guān)心路由。確保已安裝Python,然后在終端中運行以下命令來安裝flask:
python -m pip install Flask
您可以在Flask文檔中找到完整的安裝和設(shè)置詳細信息 。
接下來,創(chuàng)建一個 .py 文件,例如 main.py 并添加以下內(nèi)容:
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對象導(dǎo)入。然后使用名稱實例化它 __name__ 在將其分配給 app 變量。該命名方案是Flask文檔中的約定。
接下來,我們使用 @app.route 裝飾者傾聽 POST 針對 /webhook 路徑。當(dāng)對路由提出請求時,此裝飾器調(diào)用緊隨其后的函數(shù)。在這種情況下, respond 功能。
就本例而言,我們 print 將請求作為json發(fā)送,然后返回 Response 狀態(tài)代碼為200。此響應(yīng)告訴發(fā)送者我們已收到該掛鉤。您應(yīng)該能夠使用Flask的首選技術(shù)來運行服務(wù)器:
export FLASK_APP=main.py
python -m flask run
就是這樣!現(xiàn)在,我們有了一個應(yīng)用程序,該應(yīng)用程序使用python和flask監(jiān)聽webhook。部署后, POST 向端點發(fā)出的請求將觸發(fā) respond 功能。
例如:webhook. 這也是您將提供發(fā)送Webhook服務(wù)的URL。
接收Django的Webhook
在Django中設(shè)置應(yīng)用程序要比Flask自動化得多,但這也帶來了更精細的文件結(jié)構(gòu)。作為更傳統(tǒng)的模型-視圖-控制器(MVC)框架,Django為您提供了該項目的主要部分。完整的安裝指南可在 官方的Django文檔頁面上找到,但也可以通過以下方式安裝 pip 使用以下命令:
python -m pip install Django
如果您是從頭開始建立專案,請使用 django-admin 實用程序來創(chuàng)建一個新項目。如果您已有要添加Webhooks的Django項目,請?zhí)料乱徊健?/p>
django-admin startproject example-project
這為新的Django項目奠定了基礎(chǔ)。導(dǎo)航到新創(chuàng)建的文件夾,您將看到類似于以下內(nèi)容的結(jié)構(gòu):
example-project/
manage.py
example-project/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
我們可以通過運行來確認一切正常 python manage.py runserver。
Django的慣例是在此外部“項目”中設(shè)置“應(yīng)用”。您可以避免這種情況,并通過運行來設(shè)置一個單應(yīng)用程序項目 django-admin startproject example-project .尾隨句點(。)代替。對于本教程,我們將鏡像首選的方式,如前所示。
為此,我們將設(shè)置一個名為webhooks的“應(yīng)用程序” 。
python manage.py startapp webhooks
這將創(chuàng)建一個名為webhooks的新目錄 。現(xiàn)在我們可以編寫一些代碼。
我們將專注于三個文件: webhooks/views.py, webhooks/urls.py (尚未創(chuàng)建),以及 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.')
此代碼執(zhí)行以下操作:
它導(dǎo)入 HttpResponse 用于發(fā)送響應(yīng)的對象。
它導(dǎo)入一個特殊的裝飾器以限制請求方法。在Django中,路由默認情況下接受所有HTTP方法,并讓視圖管理它們響應(yīng)的方法。
調(diào)用裝飾器,將其后的功能限制為僅 POST 方法。
定義一個函數(shù),名為 example 將請求作為參數(shù)并返回響應(yīng)。
這個 example 函數(shù)的名稱將鏈接到我們的 urls.py 盡快歸檔。它不需要與特定路徑對齊。
接下來,建立 webhooks/urls.py 如果尚不存在。這是我們在項目的此子應(yīng)用程序內(nèi)組織路線的地方。
from django.urls import path
from . import views
urlpatterns = [
path('example/', views.example)
]
在這里,我們導(dǎo)入 path 從 django.urls。它定義了各個路線,并將它們與視圖關(guān)聯(lián)。接下來,我們導(dǎo)入所有視圖。
最后, urlpatterns 被傳遞路徑列表。Django將此列表識別為與應(yīng)用程序關(guān)聯(lián)的路由。
在這種情況下,我們定義了以 example/ 并與視圖關(guān)聯(lián) views.example,這是我們函數(shù)的名稱 views.py。
完成此操作后,我們的應(yīng)用程序可以運行,但是我們需要將其告知外部項目。打開 example-project/urls.py。它看起來應(yīng)該與先前的文件相似,但是已經(jīng)存在 admin 路線。像這樣添加新路徑:
urlpatterns = [
path('admin/', admin.site.urls),
path('webhooks/', include('webhooks.urls'))
]
如果您的服務(wù)器已停止,請使用 python manage.py runserver。
現(xiàn)在嘗試向發(fā)出POST請求 /example/(如果不同,請用您自己的主機和端口替換)。
這樣,我們就建立了一個Django項目,該項目監(jiān)聽一個Webhook /webhooks/example。部署后,將此路徑附加到完整URL上,并將完整URL提供給發(fā)送Webhook的服務(wù)。
在本地測試Webhooks
要在本地進行Webhooks的測試而不進行部署,我們需要打開從開發(fā)機器到外界的連接。
一種選擇是使用 ngrok。通過此服務(wù),您可以提供對本地計算機上特定端口的外部訪問。這非常適合我們的需求。首先,請注冊并按照安裝和入門說明進行操作。
完成后,如果您使用的是MacOS,則應(yīng)該可以運行 ./ngrok http 3000 在將3000替換為正在運行的Python應(yīng)用程序的端口的終端中。例如,默認的Django站點通常在端口8000上運行。
一旦啟動并運行,ngrok將為您提供一個可用于測試Webhook的URL。在Bearer中,我們在通知設(shè)置中提供了“測試”按鈕。
配置完成后,您將開始在該URL接收webhook。開發(fā)和測試完成后,請不要忘記將其更改為最終部署的Webhook URL。
您可以使用此信息做什么?
一旦配置了Webhook,則取決于您如何處理它收到的信息。您可以使用此信息對事件進行實時響應(yīng),使應(yīng)用程序的功能翻轉(zhuǎn),甚至可以將其用作將數(shù)據(jù)寫入數(shù)據(jù)庫的方式。您的Webhook可以具有無數(shù)種功能,具體取決于API提供程序發(fā)送的信息類型。
盡管我們在本文中構(gòu)建了一個基本的實現(xiàn),但是值得一提的是,許多服務(wù)都提供了驗證請求是否來自實際來源的方法。這可以通過限制訪問您的應(yīng)用程序的URL或通過匹配密鑰來完成。例如,GitHub允許您設(shè)置將隨每個Webhook發(fā)送的秘密。
以上就是關(guān)于如何使用Python收聽Webhooks的全部內(nèi)容介紹,想了解更多關(guān)于Python的信息,請繼續(xù)關(guān)注中培偉業(yè)。