Python 将自定义Django命令的输出重定向到浏览器
我创建了一个自定义命令,它接受一个位置参数和一个命名的可选参数。它执行许多检查、下载文件、解压并用解压后的数据填充数据库 为了让用户更方便,我创建了一个简单的表单并创建了一个视图:Python 将自定义Django命令的输出重定向到浏览器,python,django,django-commands,Python,Django,Django Commands,我创建了一个自定义命令,它接受一个位置参数和一个命名的可选参数。它执行许多检查、下载文件、解压并用解压后的数据填充数据库 为了让用户更方便,我创建了一个简单的表单并创建了一个视图: from django.views.generic.edit import FormView from django.core import management from .forms import DownloadForm class DownloadFormView(FormView): templ
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
方法直接打印。您可以通过Ajax执行任务,只需锁定屏幕,直到服务器返回响应。但这是一种糟糕的做法。最好的解决办法是用芹菜(或类似的东西)。这是一个分布式任务队列。执行后,数据将写入数据库。在此之前,临时结果将存储在NoSQL中。在本例中,这称为代理。之后,您可以使用上面给出的建议。您只需询问服务器答案是否准备好。如果是这样,您可以将其返回并显示给用户。因此,服务器上的负载将显著减少。听起来您需要了解API的工作原理,也许还需要了解django rest框架。在浏览器中向模板提供命令输出并不是一种简单的单线方式。您的浏览器可能需要在给定的时间间隔点击API,以查看响应是否就绪。另一个选择是查看通道。@DataSwede我经常使用Django REST框架,但我认为它不是执行此任务的合适工具。感谢您提及频道
。这可能会有所帮助。我来看看。谢谢你的回答。我知道芹菜,但我不确定它是不是合适的工具。在我看来,使用像NoSQL这样的额外存储似乎是一种过度使用。我的主要问题是获得对标准输出的读取权限,然后使内容可供视图使用。