Как я могу отобразить html-страницу Django после завершения фоновой задачи сельдерея

Проблемы: я использую сервер rabbitmq с сельдереем

  1. Мне нужно запустить несколько задач в фоновом режиме. Что я могу сделать
  2. Когда каждая задача завершена, мне нужно отобразить html-страницу, чтобы запустить html-страницу, мне нужен объект запроса в качестве аргумента, к какой задаче сельдерея не может получить доступ
  3. К тому времени, когда задача сельдерея завершена, я выхожу из функции, которая имеет объект запроса

from future import unicode_literals, absolute_import из django.shortcuts import render from celDemo.celery import app time from django.http.response import HttpResponseRedirect # Создайте здесь свои представления.

dictionary = {}
msg = "Hello!"

def testing(request):

    print 'In 1st page:'
    return render(request,'index.html')

def testcelery(request):

    print 'In testcelery'

    if request.method == 'POST':
        print 'On click event'
        value = str(request.POST['variable'])
        print request
        dictionary[value] = request
        print dictionary[value]
        try:
            make_wait.delay(value)
            return render(request,'index.html')
        except:
            return render(request,'nothing.html')

@app.task
def make_wait(value):
    print dictionary
    print msg
    print 'Started sleeping :)'
    actual2()
    print 'Slept :D'
    #request = dictionary[value]
    print value
    print 'before initiaing the request'
    return render('nothing.html')
    print 'after initiating the request'
    #return value


def actual2():
    result = actual()
    return result


def actual():
    time.sleep(25)
    return 'slept :D'

person SBN AB    schedule 05.07.2017    source источник


Ответы (1)


Вы можете использовать AJAX для получения содержимого nothing.html перед фактическим выполнением запроса POST. Замените тело содержимым извлеченного nothing.html, а затем выполните запрос POST, который вернет содержимое index.html. Замените тело окончательным html полученным index.html.

Пример кода:

// js
<script>
  $.ajax({
    url: 'url_to_get_nothing_html',
    type: 'GET',
    success: function(data) {
      $('body').html(data);
      $.ajax({
        url: 'url_to_index_html',
        type: 'POST',
        data: <data>,
        success: function(data) {
          $('body').html(data);
        }
    }
</script>
person Sachin    schedule 05.07.2017
comment
Спасибо Сачину. Но моя проблема в том, что make_wait.delay (value) return render (request, 'index.html') # Я не могу вернуть эту страницу отрисовки, потому что я нахожусь в фоновом режиме. Я не могу понять, как мне поможет ajax. Все, что мне нужно, это получить доступ к основным переменным процесса, и я хочу вернуть страницу Html в браузере. - person SBN AB; 05.07.2017
comment
@SBNAB после завершения процесса сельдерея вернуть содержимое index.html, которое вы можете заменить на своей странице, а не return render ... - person Sachin; 06.07.2017
comment
да. Сделайте вызов ajax. - person Sachin; 06.07.2017