Вызов программы Python CLI из представлений django и отображение результатов обратно асинхронно? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть проект django с веб-интерфейсом, в котором вы можете загружать файлы, и после успешной загрузки он вызывает cli-версию программного обеспечения для обработки и возвращает результат после успешного выполнения

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

from cliproject.main import clirunner
# Some code for file upload and saving
clirunner()

. Он запустит скрипт Python командной строки main.py, который присутствует в каталоге cliproject/, и он сделает некоторые вещи и сохранит вывод.

Проблема в том, что весь этот процесс является синхронным в данный момент.Следовательно, страница пользователя загружается после загрузки файла из пользовательского интерфейса и до тех пор, пока он не будет обработан скриптом Python CLI за кулисами.Процесс выглядит так:

Django UI
   | (User upload files)
views.py gets request and saves it somewhere
   | (views run clirunner() to give python cli program control)
cliproject runs
   | (After doing the stuff which is intended, it saves the output file)
views.py resumes
   | (Reads the output file)
Django UI displays the output file

Итак, мы видим проблему здесь в том, что я вызываю другую программу CLI из views.py, чтобы выполнить то, что мне нужно.Но это происходит синхронно.

Мне нужно сделать процесс асинхронным, и я хочу показать что-то в виде полосы загрузки, чтобы уведомить их о том, что программа cli выполняется на задней стороне и имеет статус.После выполнения программы CLI полоса загрузки достигнет 100%, и асинхронный интерфейс django отобразит вывод

Я пробовал Celery.Но я не мог понять, как заставить эту панель загрузки работать на основе сценария python cli.Есть идеи?

1 Ответ

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

У меня есть мысль, вам нужно:

A) Асинхронно запустить задачу

B) Чтобы иметь возможность получить значение ее текущего состояния.

Вот идея:

1) Сделайте задачу командой manage.py, которую вы можете вызывать с помощью потоков или вызывать задачу Celery.

2) По мере выполнения задачи попросите ее записать текущее состояние завершения, используя модель Django, в выбранную вами БД.(Вышеуказанный шаг предназначен для упрощения использования БД. Вы всегда можете написать напрямую, если вам нужно это сделать.)

3) Передать идентификатор задачи (назначенный вами или созданный Celery, в столбце БДкоторый индексируется) к контексту шаблона и использует AJAX-вызов для проверки связи с представлением, которое возвращает процент завершения из поиска в базе данных, а затем устанавливает ваше завершение оттуда.

Таким образом, ваше представление отправляет и запускает задачу,он заботится о том, чтобы пометить свою собственную работу, а затем другое представление просто делает быстрый запрос БД, чтобы выяснить, где оно находится.

Отредактировано, чтобы добавить: Вы также можете использовать cache бэкэнд и записать ввведите что-то вроде memcached, redis и т. д., чтобы избежать пингов в вашей реляционной базе данных.

...