Джанго разрешить ответный ответ до завершения другого процесса - PullRequest
0 голосов
/ 08 октября 2018

У меня проблема, когда я хочу запустить 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 всегда возвращает Hook execution failed: Net::ReadTimeout, как мы знаем npm install & npm run build занимает много времени.

Итак, я хочу продолжить этот процесс в фоновом режиме, и в течение нескольких секунд простовозврат "pull & build welldone!".Спасибо, прежде чем ..

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете использовать сельдерей для этого:

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 здесь .

...