Django - Лучший способ вернуть внутрипроцессный текст с сервера на JQuery? - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю то, что может в итоге стать веб-приложением / игрой для веселого сайд-проекта. В приложении у пользователя есть возможность запустить функцию на стороне сервера, которая будет выполнять несколько процессов на серверной части. Иногда это может занять несколько минут, поэтому я пытаюсь понять, как вернуть текст из Django во внешний интерфейс без полного «возврата» из внутреннего интерфейса в начало. Есть ли хороший способ сделать это? Я экспериментировал с StreamingHttpResponse, но не смог понять, и даже не уверен, что это правильное решение. Ниже приведен пример того, как выглядит мой поток.

Текущее состояние

  • Пользователь нажимает кнопку на веб-сайте и появляется сообщение Ajax вызов Django функции

  • Эта Django функция вызывает ~ 4 подфункции, каждая из которых выполняет определенную обработку

  • После завершения всех операций -функции (~ 2 минуты статического интерфейса), Django возвращает HTTPResponse успеха и запускает refre sh страницы интерфейса

Желаемое состояние

  • Пользователь нажимает кнопку на веб-сайте, и существует Ajax пост-вызов функции Django

  • Эта Django функция вызывает ~ 4 подфункции, каждая из которых выполняет определенную обработку

  • После завершения подфункции 1 (~ 30 секунд) в интерфейсную часть возвращается сообщение о том, что «процесс X завершен» , 25% выполнено за этот период '

  • После завершения подфункции 2 (~ 30 секунд) сообщение возвращается внешний интерфейс говорит: «Процесс Y выполнен, 50% завершено за этот период» ... et c для других функций

  • После завершения всех подфункций, Django возвращает HTTPResponse of success и вызывает refre sh страницы интерфейса

Спасибо!

1 Ответ

2 голосов
/ 04 апреля 2020

На самом деле вы пытаетесь установить полный дуплекс клиент-серверный обмен данными. Есть много стратегий, чтобы сделать это возможным:

  • WebSockets, протоколы чата, протоколы IoT и т. Д.

В Django, есть хороший пакет под названием channels для реализации этого: https://channels.readthedocs.io/en/latest/

  • Ответ Ресурсы Lazy URI

A Стратегия может заключаться в том, чтобы немедленно ответить на HTTPResponse с URI, который будет обслуживать ресурс, когда он будет доступен (с маркером безопасности ). И вы можете предоставить другую конечную точку, которую интерфейсный пользователь может вызывать всякий раз, когда он хочет узнать ход обработки, выдавая токен .

  • Асинхронные рабочие нагрузки

Насколько я понимаю, вы выполняли обработку синхронно , блокируя ответ HTTP во время всех задач обработки. На самом деле, с политикой тайм-аута, это может быть проблематично c.

И, наконец, если вы хотите масштабировать свое приложение, вы, вероятно, хотели бы разделить чисто отвечающие HTTP-запросы и долго обрабатывать рабочие нагрузки.

Для этого вам может потребоваться асинхронная обработка, для который celery является python естественным кандидатом.

...