首页 > 解决方案 > Django从用户那里获取数据,离线处理以将CSV发送给用户

问题描述

我可能无法为您提供有关我尝试过的代码的任何信息。但是没有任何搜索或研究可以让我得到有效的结果。

我想做什么? 我有一个用户提交 CSV 文件的表单。该文件在后端处理以从数据库中检索数据。从 DB 恢复的数据再次以 CSV 格式写入并邮寄给用户。

此处理大约需要 5-10 分钟。因此,我想向用户显示您的工作正在进行中的消息,一旦完成,您将获得 CSV 文件。

我现在的代码。

def bulkserachpro(request):
    with request.FILES['searchnum'] as csvfile:
                spamreader = csv.reader(csvfile,dialect=excel)
                next(spamreader)
                a = [] 
                b = []
                for row in spamreader:
                    a.append((row[0]).upper())
                data_list = nummodel.objects.filter(number__in=a)
                csvfile = StringIO.StringIO()
                csvwriter = csv.writer(csvfile)
                csvwriter.writerow(['a','b'])
                for data in data_list:
                    csvwriter.writerow([data.a,data.b])
                message = EmailMessage("Hello","Your report","email@gmail.com",["emailto@gmail.com"])
                message.attach('invoice.csv', csvfile.getvalue(), 'text/csv')
                message.send()
            return render(request,'bulkpro.html',messages.add_message(request, messages.SUCCESS,'File uploaded Succesfully.'))

这段代码完成了它的工作。但由于用户不能等待 5-10 分钟,他会收到超时错误消息。我应该在这里更改什么,以便用户收到以下消息,并且一旦处理完成,他就会收到带有附件的电子邮件。

收到您的文件,它将被处理并发送到您的邮件 ID。

标签: djangodjango-views

解决方案


在视图中等待肯定会超时,任何解决问题的技巧都不是直截了当的。而是每隔一段时间进行 AJAX 调用以了解如下状态。

  • 发布 CSV 后,启动一个 celery 任务来完成这项工作。

  • AJAX 查询任务的状态(之前调用中传递的任务 ID)以了解作业的状态。

  • 相应地显示任务的完成或进度。

  • 在 celery 任务中使用 CSV 发送电子邮件。


推荐阅读