python - 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()
解决方案
推荐阅读
- python - 从“dict_keyiterator”中删除项目
- angular - 带角管的公斤格式化器
- php - 从 PHP 中的 bing 网络搜索解析 Json 文件
- php - CodeIgniter 事务 - trans_status 和 trans_complete 返回 true 但没有提交
- javascript - 如何使用 indexOf() 检查我的数组中的字符串是否部分匹配另一个数组中的字符串?
- timestamp - 当其粒度以微秒为单位时,将 startAfter/startAt 与 orderBy Firestore 的时间戳一起使用是否安全?
- javascript - Express / Handlebars - 无法访问请求对象
- python - Pandas 数据框可以在网页上加载多少数据?
- javascript - 用户点击javascript后刷新页面
- javascript - 如果有超过3个具有相同x位置的jquery将类添加到所有元素