【问题标题】:Redirect the output of custom Django command to the browser将自定义 Django 命令的输出重定向到浏览器
【发布时间】:2018-06-27 19:17:24
【问题描述】:

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

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

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 方法打印。

【问题讨论】:

  • 听起来您需要了解 API 的工作原理,或许还需要研究 django rest 框架。在浏览器中向模板提供命令输出不会是一种简单的单行方式。您的浏览器可能需要以给定的时间间隔访问 API 以查看响应是否已准备好。另一种选择是查看渠道。
  • @DataSwede 我经常使用 Django REST Framework,但我认为它不是完成这项任务的正确工具。感谢您提及Channels。那可能会提供一些东西。我去看看。

标签: python django django-commands


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我知道 Celery,但我不确定它是否是正确的工具。在我看来,使用像 NoSQL 这样的额外存储有点过头了。我的主要问题是获得对标准输出的读取权限,然后将内容提供给视图。
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多