Несколько рендеринга в 1 функцию в views.py Django - PullRequest
0 голосов
/ 15 мая 2019

Я очень новичок в Джанго ... Используя кнопку отправки, я хочу запустить файл python в фоновом режиме и отобразить содержимое на следующей странице ... Но мой файл python требует некоторого времени, чтобы получить результат, поэтому между ними я хотел поместить загрузочную html-страницу между ....

Я написал некоторый код, который корректно запускает файл python, но я не могу добавить страницу загрузки между ними ... Взгляните на мою функцию в views.py

def submit(request):
    info = request.POST['info']
    print('value is ', info)
    filename = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    result = run(['python', filename, info], stdout= PIPE )
    return render_to_response("loading.html")
    run(['python', filename, info], stdout= PIPE )
    return render(request, 'python_output.html', context)

АКТУАЛЬНЫЙ РЕЗУЛЬТАТ: return render_to_response ("loading.html") работает но тогда управление не сдвигается для запуска команды ... Я хочу запустить загрузочную html-страницу и запустить файл python в фоновом режиме, а когда завершится запуск файла python, он должен перейти на страницу python _output.html, где отображается вывод ...

Ожидаемое : Загрузка страницы должна работать, и после этого элемент управления должен перейти к выполнению команды, а затем перейти на страницу python_output.html ... /

Ответы [ 4 ]

1 голос
/ 15 мая 2019

Оператор return завершит выполнение функции, поэтому все, что находится ниже, никогда не будет достигнуто.

Вы можете использовать Javascript, чтобы отобразить значок загрузки, а затем использовать JQuery, чтобы выполнить запрос GET в фоновом режиме, где вы вызываете пользовательское представление из Django, которое выведет результат команды. После получения данных вы можете удалить значок и обработать данные так, как вам нужно.

Базовый пример:

Django
------

    url(r'^command/', views.command, name='command'),

    def command(request):
        info = request.POST['info']
        filename = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        result = run(['python', filename, info], stdout= PIPE
        return result

Javascript
----------

    <img id="loading-icon" src="loading.gif">

    $.get("/command", function(text)
    {
        $("#loading-icon").remove();
        process(text);
    });
0 голосов
/ 15 мая 2019

Попробуйте использовать ajax-запрос, когда вы загружаете свою первую страницу (loading.html), чтобы запустить файл python в фоновом режиме, и когда это будет сделано, отобразите результат через output.html.

Используя JQuery,в файле шаблона вы должны вызвать такую ​​функцию:

<script>
var url_file_to_run = "{% url "your_app:file_to_run_adress" 0 %}";
var url = "{% url "your_app:python_output" 0 %}";
$.ajax({
  url: url_file_to_run,

  }
}).done(function(data) {
    $( location ).attr("href", url);
  });
</script>

Надеюсь, я понимаю вашу проблему.

0 голосов
/ 15 мая 2019

То, что вы хотите, требует немного больше работы, чем вы могли ожидать:

  • Установите среду фоновых задач, такую ​​как сельдерей (и очередь, как Redis или RabbitMQ для хранения задач), которая будет извлекать задачи изочереди и обработать их.
  • Ваш первоначальный вид должен запустить фоновое задание.
  • Вы хотите отслеживать идентификатор задачи для этой задачи, либо возвращая его в своем ответе пользователю, либо сохраняя его в сеансе пользователя.Ваше представление отвечает HTML-страницей с надписью «пожалуйста, наберитесь терпения ...» и javascript для обработки следующего (см. Ниже).
  • Затем вам нужно представление, которое может проверить состояние задачи (на основелибо идентификатор_задачи, переданный в запросе, либо сохраненный в текущем сеансе).Он отвечает JSON, говоря «status = processing ...» или «status = done» с результатом задачи.
  • На странице HTML вам необходим JavaScript, который запрашивает просмотр через регулярные промежутки времени.до тех пор, пока состояние не будет «выполнено», а затем обработает результат задачи по обновлению HTML-кода страницы.

Найдите «учебник по django celery», и вы найдете множество примеров.

0 голосов
/ 15 мая 2019

Вам нужно понять основной поток в Джанго

enter image description here

Вы можете добавить только один возврат в вашем представлении. после выполнения первого возврата он переходит к промежуточному программному обеспечению ответа, поэтому все остальные возвращаемые ниже значения игнорируются. Загрузка может быть выполнена в javascript в frontend

...