Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将自定义Django命令的输出重定向到浏览器_Python_Django_Django Commands - Fatal编程技术网

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这样的额外存储似乎是一种过度使用。我的主要问题是获得对标准输出的读取权限,然后使内容可供视图使用。