由于我写的网站样式在频繁的更改,每次我都要去服务器上执行git pull
,很麻烦,于是查了一下Coding的文档写了WebHook。
WebHook是什么?
WebHook 是Coding/Github之类的网站,提供的一个服务。
以Coding为例,它可以为你的库设定五种监听事件,在这些事件发生的时候就会发送一个POST请求到最上方指定的网址。
编写
根据Coding开发者文档,在项目的settings.py
里加上在Coding里填写的令牌。
# WebHook Settings
# https://open.coding.net/webhooks-v2/
WebHook_Token = "iloveyou"
编写一个视图函数来处理请求,在此处要注意,Coding的内容类型一定要是application/json
,不然会因为中文的编码问题导致sha1
计算错误。并且该视图函数一定要加@csrf_exempt
来绕过Django的防CSRF攻击中间件。
Django获取Header信息的方式是HTTP_
加上全部大写的名称(-
要换成_
)
import subprocess
import hmac
from hashlib import sha1
from django.http import JsonResponse, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from . import settings
@csrf_exempt
def webhook(request):
event = request.META.get("HTTP_X_CODING_EVENT")
signature = request.META.get("HTTP_X_CODING_SIGNATURE", "").replace("sha1=", "")
mac = hmac.new(settings.WebHook_Token.encode("ASCII"), msg=request.body, digestmod=sha1)
if not hmac.compare_digest(str(mac.hexdigest()), str(signature)):
return HttpResponseForbidden("What do you want to do?")
if event == "ping":
return JsonResponse({"message": "pong"})
elif event == "push":
subprocess.Popen("git pull", cwd=settings.BASE_DIR, shell=True)
return JsonResponse({"message": "success"})
在服务器更新之后,尝试ping
一下,如果出现绿色对号则成功了。如果出现其他的,可以点击修改,看发送记录详情。