代码之家  ›  专栏  ›  技术社区  ›  Sapna Sharma

Django从用户处获取数据,离线处理,将csv发送给用户

  •  1
  • Sapna Sharma  · 技术社区  · 7 年前

    关于我尝试的代码,我可能无法向您提供任何信息。但是没有一个搜索或研究能给我一个工作结果。

    我想做什么? 我有一个表单,用户在其中提交一个csv文件。此文件在后端进行处理以从数据库中检索数据。从数据库恢复的数据再次以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。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Will Keeling    7 年前

    尽管芹菜经常被用于这类事情,对于这个简单的例子,您可能只需要在一个线程中运行csv处理。

    例如,创建一个封装处理代码的线程:

    import threading
    
    class ProcessCsv(threading.Thread):
    
        def __init__(self, csvfile):
            self.csvfile = csvfile
            self.daemon = True
    
        def run(self):
            spamreader = csv.reader(self.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()
    

    然后您的视图可以启动线程,并只显示“您的文件已收到,将被处理…”消息:

    def bulkserachpro(request):
        process = ProcessCsv(request.FILES['searchnum'])
        process.start()  # Start the csv processing in a separate thread
        # Display "your file is being processed" message
        return render(request,'bulkpro.html',messages.add_message(request, messages.SUCCESS,'File uploaded Succesfully.'))
    
        2
  •  0
  •   Vinay P    7 年前

    在视图中等待肯定会超时,任何解决问题的技巧都不是直接向前的。相反,每隔一段时间进行Ajax调用,以了解以下状态。

    • 在发布csv之后,启动一个芹菜任务来完成工作。

    • Ajax查询任务的状态(在上一次调用中传递的任务ID),以了解作业的状态。

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

    • 在芹菜任务中使用csv发送电子邮件。