Перенаправить вывод пользовательской команды 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. В этом случае это называется брокером. После этого вы можете воспользоваться советом, данным выше. Вы просто спрашиваете сервер, готов ли ответ. Если это так, вы можете вернуть его и показать пользователю. Таким образом, нагрузка на сервер будет значительно снижена.