Django 允许 return 在另一个进程完成之前响应

Django allow return response before another proccess finished

我想 运行 Webhook 时遇到问题。在这种情况下,我想 运行 另一个脚本来构建项目,比如说 runaway.sh

#!/bin/bash

cd /home/myuser/envs/project-vue
git pull https://username:password@gitlab.com/username/project-vue
npm install
npm run build

然后在我的 views.py 中,我尝试将其命名为命令:

@csrf_exempt
def gitlab_webhook_view(request):
    header_signature = request.META.get('HTTP_X_GITLAB_TOKEN')

    if header_signature == settings.GITLAB_WEBHOOK_KEY:
        subprocess.call(os.path.join(settings.BASE_DIR, 'runaway.sh'))
        return HttpResponse('pull & build welldone!')

    return HttpResponseForbidden('Permission denied.')

但是 gitlab 总是 return Hook execution failed: Net::ReadTimeout,我们知道 npm install & npm run build 需要很长时间。

所以,我想在后台服务中继续该过程,只持续几秒钟 return "pull & build welldone!"。之前谢谢..

您可以为此使用 celery

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def pull_proc():
    subprocess.call(os.path.join(settings.BASE_DIR, 'runaway.sh'))

在视图中,您可以像这样在后台调用此任务:

@csrf_exempt
def gitlab_webhook_view(request):
    header_signature = request.META.get('HTTP_X_GITLAB_TOKEN')

    if header_signature == settings.GITLAB_WEBHOOK_KEY:
        pull_proc.delay()
        return HttpResponse('pull & build welldone!')

    return HttpResponseForbidden('Permission denied.')

您可以找到有关如何使用 django 设置芹菜的说明 here