首页 > 解决方案 > Django信号在文件保存在服务器之前被触发?

问题描述

我正在学习如何使用 Django 信号和 celery 任务。因此,我正在将批量 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()

标签: pythondjangocelerydjango-signals

解决方案


推荐阅读