Я учусь работать с сигналами 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()