Django получает данные от пользователя, обрабатывает их в автономном режиме, чтобы отправить пользователю CSV - PullRequest
0 голосов
/ 21 мая 2018

Возможно, я не смогу предоставить вам что-либо в отношении кода, который я пробовал.Но ни один из поисков или исследований не мог дать мне работающего результата.

Что я пытаюсь сделать? У меня есть форма, в которой пользователь отправляет файл 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 минут, он получит сообщение об ошибке тайм-аута.Что я должен изменить здесь, чтобы пользователь получил следующее сообщение, и после того, как обработка будет завершена, он получит электронное письмо с вложением.

Ваш файл получен, он будет обработан и отправлен на ваш почтовый идентификатор.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Хотя Celery часто используется для такого рода вещей, в этом простом случае вы могли бы просто запустить обработку 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.'))
0 голосов
/ 21 мая 2018

Ожидание в представлении, безусловно, истечет, любые уловки, чтобы решить проблему, не являются прямыми.Вместо этого делайте вызовы AJAX через определенные промежутки времени, чтобы узнать состояние, как показано ниже.

  • После публикации CSV, запустите задачу сельдерея, которая выполняет эту работу.

  • AJAX-запрос статуса задачи (идентификатор задачи, переданный во время предыдущего вызова), чтобы узнать статус работы.

  • Отобразить завершение или ход выполнения задачи соответственно.

  • Отправьте письмо с CSV в задании сельдерея.

...