Nano Hash - криптовалюты, майнинг, программирование

Множественный рендеринг в 1 функции в views.py Django?

Я очень новичок в Django... Используя кнопку отправки, я хочу запустить файл 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.../


  • return в python (и большинстве других языков программирования) означает: это результат функции/метода, выйдите сейчас. Таким образом, любой код после return никогда не будет достигнут. 15.05.2019
  • @dirkgroten Спасибо за ответ... Любой альтернативный метод, с помощью которого я могу это сделать?? 15.05.2019
  • Django — это синхронный фреймворк, вы не можете легко запустить задачу в фоновом режиме. Поэтому, когда вы вызываете run, django будет ждать, пока это не будет выполнено успешно. Используйте Celery и очередь для управления фоновыми задачами. 15.05.2019
  • Итак, что вы хотите, включает в себя: запуск фоновой задачи с использованием асинхронной среды (например, задачи сельдерея) и возврат task_id в браузер (или сохранение его в сеансе), наличие другого представления, которое может получать статус задачи при запросе, запись javascript на внешнем интерфейсе, чтобы регулярно запрашивать это представление, а когда задача завершена, обрабатывать ответ для обновления текущей страницы. 15.05.2019
  • Любой пример кода или статьи для справки?? 15.05.2019
  • на самом деле, я думаю, что ответ Амина ниже, вероятно, самый простой вариант, просто отправляя форму с помощью javascript в первую очередь, поэтому вы можете попросить пользователя подождать, пока ответ обрабатывается синхронно. 15.05.2019

Ответы:


1

Оператор 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);
    });
15.05.2019
  • Большое спасибо за вашу работу ... Но как этот файл python будет запускаться ... управление перейдет к команде run () ?? 15.05.2019

  • 2

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

    введите здесь описание изображения

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

    15.05.2019
  • Спасибо за ответ .. Я понял это ... Не могли бы вы предоставить мне альтернативный метод ?? 15.05.2019

  • 3

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

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

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

    15.05.2019

    4

    Попробуйте использовать запрос 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>
    

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

    15.05.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..