Перенаправить вывод пользовательской команды Django в браузер

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

Чтобы сделать вещи более удобными для пользователей, я создал простую форму и создал представление:

from django.views.generic.edit import FormView
from django.core import management

from .forms import DownloadForm

class DownloadFormView(FormView):
template_name = 'frontend/download.html'
form_class = DownloadForm
success_url = '.'

def form_valid(self, form):
    country = form.cleaned_data['country'][:3]
    levels = int(form.cleaned_data['country'][-1:])
    management.call_command('download_shapefile', country, levels=levels)
    return super(DownloadView, self).form_valid(form)

Это работает нормально, и теперь я хочу предоставить обратную связь пользователю, поскольку команда может выполняться некоторое время.

Есть ли возможность перенаправить вывод команды (или сделать его доступным) в шаблон и отобразить его в браузере?

В моей команде я использую:

self.stdout.write(self.style.SUCCESS('some success message'))
self.stdout.write(self.style.WARNING('some warning message'))

выводить сообщения и не печатать напрямую с print метод.

1 ответ

Вы можете выполнить свою задачу через Ajax и просто заблокировать экран, пока сервер не вернет ответ. Но это плохая практика. Лучшее решение - использовать сельдерей (или что-то в этом роде). Это распределенная очередь задач. Ваши данные будут записаны в базу данных после выполнения. До этого времени временные результаты будут храниться в NoSQL. В этом случае это называется брокером. После этого вы можете воспользоваться советом, данным выше. Вы просто спрашиваете сервер, готов ли ответ. Если это так, вы можете вернуть его и показать пользователю. Таким образом, нагрузка на сервер будет значительно снижена.

Другие вопросы по тегам