Resize/Crop 在 Django Admin 和外部使用 Django 中的 Celery 的图像
Resize/Crop an Image using Celery in django in Django Admin and outside
我想创建一个图像的多个副本,并在发送原始图像后使用 celery 调整它们的大小。
def save_model(self, request, obj, form, change):
updated = change
super().save_model(request, obj, form, change)
if not updated:
logo = CompanyLogo(logo=form.cleaned_data['logo'], company=obj)
logo.save()
# Send Celery task to create resize images
task_company_logo.delay(form.cleaned_data['logo'])
任务方法调用
def crop_image(path):
image = Image.open(os.path.join(settings.MEDIA_ROOT, path))
image.show()
我有以下错误:
'InMemoryUploadedFile' is not JSON serializable
我理解错误,因为我从表单发送所有图像obj,我只想获取原始图像的路径。
form.cleaned_data['logo']
返回一个 InMemoryFile
不能作为参数直接传递给 celery 任务。您需要将此文件保存到临时位置并将路径传递给 celery 任务,或者您可以通过 save_model
方法传递文件名,celery 任务将在此处使用此名称:
task_company_logo.delay(filename) # pass filename here
image = Image.open(os.path.join(settings.MEDIA_ROOT, path))
构建路径。
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
path = default_storage.save('tmp/name.jpg',
ContentFile(form.cleaned_data['logo'].read()))
编辑:
您可以使用
获取文件名
if not updated:
logo = CompanyLogo(logo=form.cleaned_data['logo'], company=obj)
logo.save()
# Send Celery task to create resize images
filename = logo.logo.path # this can be passed to celery task
task_company_logo.delay(filename)
我想创建一个图像的多个副本,并在发送原始图像后使用 celery 调整它们的大小。
def save_model(self, request, obj, form, change):
updated = change
super().save_model(request, obj, form, change)
if not updated:
logo = CompanyLogo(logo=form.cleaned_data['logo'], company=obj)
logo.save()
# Send Celery task to create resize images
task_company_logo.delay(form.cleaned_data['logo'])
任务方法调用
def crop_image(path):
image = Image.open(os.path.join(settings.MEDIA_ROOT, path))
image.show()
我有以下错误:
'InMemoryUploadedFile' is not JSON serializable
我理解错误,因为我从表单发送所有图像obj,我只想获取原始图像的路径。
form.cleaned_data['logo']
返回一个 InMemoryFile
不能作为参数直接传递给 celery 任务。您需要将此文件保存到临时位置并将路径传递给 celery 任务,或者您可以通过 save_model
方法传递文件名,celery 任务将在此处使用此名称:
task_company_logo.delay(filename) # pass filename here
image = Image.open(os.path.join(settings.MEDIA_ROOT, path))
构建路径。
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
path = default_storage.save('tmp/name.jpg',
ContentFile(form.cleaned_data['logo'].read()))
编辑: 您可以使用
获取文件名if not updated:
logo = CompanyLogo(logo=form.cleaned_data['logo'], company=obj)
logo.save()
# Send Celery task to create resize images
filename = logo.logo.path # this can be passed to celery task
task_company_logo.delay(filename)