我正在学习如何处理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()