Django, отображать вывод Python в режиме реального времени на веб-странице - как консоль - PullRequest
0 голосов
/ 07 июня 2018

(с использованием Django) Я создаю веб-приложение, вот как оно должно работать:

  1. На веб-странице - пользователь выбирает параметр, нажимает на него
  2. URL обращается к связанному представлению
  3. Внутри функции представления запускается обработка другой функции модуля Python, которая занимает некоторое время (может быть 5 минут или 2 часа)
  4. Журнал выполнения функции виден навеб-страница в том виде, в каком она есть - выполнение в реальном времени отображается на самой веб-странице (асинхронно)

Я обнаружил, что этого можно добиться с помощью AJAX.И я попробовал что-то вроде этого:

views.py:

from lib.testnew import testprint

def printtest(request):
    if 'create_btn' in request.POST:
        test = testprint()
        data = test.printing()
        logger.info(data)
        return render(request, 'create.html', {'data': data})
    else:
        logger.info("initiating")
        return render(request, 'createvm.html')

create.html

{% extends 'base.html' %}

{% block content %}

<script type="text/javascript">
    $(document).ready(function(){

        $('#create_vm_btn').click(function(){
            $.ajax({
                type: "POST",
                url: "printtest",

                success: function(data) {
                  $("#output_id").html(data);
                  alert('Done: ' + data);
                }

            });
        });
    });

</script>
<h2>Welcome {{ user.first_name }} {{ user.last_name }}</h2>
<form method="post">
    <textarea id="output" row=3 cols=25></textarea>
    <button type="submit" class="btn btn-default" name="create_btn" id="create_btn">Create</button>
</form>
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
{% endblock %}

Для выполнения приведенной ниже строки требуется время:

data = test.printing()

Но, похоже, это не сработало, как я объяснил в пунктах.Пожалуйста, предложите правильный путь.

1 Ответ

0 голосов
/ 07 июня 2018

Если я правильно понимаю, вы хотите, чтобы первый вызов запустил «обработку» и последующие вызовы для отображения хода выполнения.Плохая новость, это не будет так просто, по той очевидной причине, что вызов функции «обработка» из представления будет блокироваться до тех пор, пока не будет возвращена функция «обработка».

Решение здесь заключается в использовании асинхронного режима.очередь задач (Celery является каноническим решением - есть более легкие, но Celery облегчает масштабирование вашей инфраструктуры, добавляя новые «обрабатывающие» серверы по мере необходимости), с одним первым представлением, запускающим задачу обработки и возвращающим идентификатор задачи, и вторым представлением(который вы можете опрашивать с помощью ajax), проверяя ход выполнения задачи (или вы можете использовать django-channel, если вы хотите пофантазировать, но я рекомендую вам начать с того, что все сначала работает с простым опросом ajax).

Кроме того, получение «прогресса» из файла журнала, безусловно, не самое простое решение.Здесь мы делаем, чтобы задачи сельдерея хранили информацию о прогрессе в Redis (которую мы уже используем в качестве бэкэнда результата сельдерея), а представление «опрос» читало их обратно.Обратите внимание, что вы, конечно, можете написать свой собственный logging.handler, чтобы сделать это (ну, по крайней мере, часть «сохранить в Redis»), если сообщения журнала - это то, что вы хотите, как «информация о прогрессе».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...