Coding-WebHook
起笔自
所属文集:
杂记
共计
1505
个字符
落笔于
由于我给媳妇儿写的网站, 样式在频繁的更改,每次我都要去服务器上执行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
一下,如果出现绿色对号则成功了。如果出现其他的,可以点击修改,看发送记录详情。