Сигнал Django срабатывает до сохранения файла на сервере? - PullRequest
0 голосов
/ 14 апреля 2019

Я учусь работать с сигналами Django и сельдереем. Итак, я загружаю основной файл CSV на сервер, и моя цель - прочитать содержимое файла после его загрузки. Теперь, это подход, который я использовал, когда объект Fileupload сохранен, я запускаю сигнал django post_save, который в основном выполняет некоторую проверку, а затем запускает задачу celery (где выполняются все операции чтения файла). Проблема в том, что файл пуст, когда он загружен на сервер. Я заметил, закомментировав бит сигнала django, и файл загружается с соответствующим содержимым, но как только я активирую сигнал, он каким-то образом прерывает операцию загрузки файла. Как активировать сигнал django, когда файл полностью загружен с содержимым.

class FileUpload(models.Model):

    file = models.FileField(blank=True)
    type = models.ForeignKey(FileType, on_delete=models.PROTECT, blank=True, null=True)
    category = models.ForeignKey(FileCategory, on_delete=models.PROTECT, blank=True, null=True)
    status = models.CharField(max_length=20,
                              choices=STATUS_CHOICES,
                              default=STATUS_NEW)

def upload_file(sender,instance,**kwargs):
    if kwargs['created']:
        process_upload_file.delay(instance.id)

@app.task(ignore_result=True)
def process_upload_file(file_id):
    try:
        logger.debug('Files:process_upload_file - called.')
        try:
            upload_file = FileUpload.objects.get(id=int(file_id))
        except FileUpload.DoesNotExist:
            return None

        if not upload_file:
            logger.error('Files:process_upload_file - Could not locate upload file with ID={}'.format(file_id))
            return
        elif not upload_file.type:
            logger.debug('Files:process_upload_file - identify.')
        elif upload_file.status == FileUpload.STATUS_NEW:
            print('Files:process_upload_file - started.')
            extract_file_tag(file_id)
    except:
        logger.exception('Files:process_upload_file - failed.')

def extract_file_tag(file_id):
    file_data = FileUpload.objects.get(id=file_id)
    file_name = str(file_data.file)
    print('filename',file_name)
    print('file_data',file_data.file)
    file_to_read = file_data.file
    with open(settings.MEDIA_ROOT + file_name, 'wb+') as destination:
        for chunk in file_to_read.chunks():
            print('chunk',chunk)


post_save.connect(upload_file,sender=FileUpload)

views.py
    def post(self,request):

        file_type,type_exists = FileType.objects.get_or_create(name='BulkSchoolUpload')
        file_category,category_exists = FileCategory.objects.get_or_create(name='school')
        user,user_exists = User.objects.get_or_create(username='system')
        print('file_type',file_type)
        print('file_category',file_category)
        file = request.FILES['file']
        print('file',file)
        comment = request.POST.get('comments',None)
        name = request.POST.get('filename',None)


        file_upload = FileUpload(file=file,type=file_type,category=file_category,status=FileUpload.STATUS_NEW,comments=comment,progress=100,
                                 creator=user)
        file_upload.save()
...