将自定义Django命令的输出重定向到浏览器

时间:2018-01-18 16:29:18

标签: python django django-commands

我创建了一个自定义命令,它接受位置和命名的可选参数。它执行许多检查,下载文件,解压缩并使用解压缩的数据填充数据库。

为了让用户更方便,我创建了一个简单的表单并创建了一个视图:

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 个答案:

答案 0 :(得分:-1)

您可以通过Ajax完成任务,只需锁定屏幕直到服务器返回响应。但这是一种不好的做法。最好的解决方案是使用Celery(或类似的东西)。这是一个分布式任务队列。执行后,您的数据将写入数据库。在此之前,临时结果将存储在NoSQL中。在这种情况下,这称为经纪人。之后,您可以使用上面给出的建议。您只需询问服务器答案是否准备就绪。如果是这样,您可以将其返回并显示给用户。因此,服务器上的负载将大大减少。