Django Проблема загрузки изображений Cloundinary
В настоящее время я изучаю Django и уже почти добрался до стадии развертывания, но столкнулся с проблемой при обслуживании статических/медийных файлов с помощью Cloudinary, следуя руководствам, как это сделать, это кажется достаточно простым. Я проверил поддержку Cloudinary, но не могу найти ничего, что могло бы помочь, просто интересно, есть ли у кого-нибудь какой-нибудь вклад.
Проблема в том, что я использую Exiffield (для получения информации об изображении) и ImageSpecField из ImageKit для изменения размера изображений для миниатюр, и я думаю, что это создает проблемы с Cloudinary.
Во-первых, я не могу загрузить изображения из Admin, я получаю Exception Value:Empty file ошибку.
Во-вторых, я получаю 400 Client Error: Bad Request for url: https://res.cloudinary.com/ **path to file*** при попытке открыть мой сайт (который обслуживается локально и находится в разработке
В качестве выгрузки используется ImageField. Я бы заменил его на CloudinaryField, но моя модель сильно зависит от ExifField, который не хочет читать из него.
Модель ниже.
image = models.ImageField(upload_to='images')
mid_thumbnail = ImageSpecField(source='image',
processors=[ResizeToFit(220, 150)],
format='JPEG',
options={'quality': 100})
gallery_thumbnail = ImageSpecField(source='image',
processors=[ResizeToFit(300, 250)],
format='JPEG',
options={'quality': 100})
gallery_detail = ImageSpecField(source='image',
processors=[ResizeToFit(1000, 850)],
format='JPEG',
options={'quality': 100})
title = models.CharField(max_length=100)
albums = models.ManyToManyField(Album, blank=True, related_name='photos')
feature_image = models.BooleanField(default=False)
description = models.CharField(editable=False, max_length=150, blank=True)
posts = models.ManyToManyField(Post, blank=True, related_name='pictures')
lens = models.TextField(editable=False, max_length=100, default='Lens Data')
caption = models.CharField(editable=False, max_length=1000, default='Caption info')
file_size = models.CharField(editable=False, max_length=20, default='File_size')
width = models.IntegerField(blank=True, null=True, editable=False)
height = models.IntegerField(blank=True, null=True, editable=False)
categories = models.ForeignKey(Catagory, on_delete=models.CASCADE, null=True, blank=True)
objects = models.Manager
info = models.TextField(default='**info empty**', blank=True, help_text="editable caption info no reversable")
exif = ExifField(source='image', denormalized_fields={'lens': exifgetter('LensID'),
'caption': exifgetter('Description'),
'file_size': exifgetter('FileSize'),
'description': exifgetter('Headline')
})
def save(self, *args, **kwargs):
super(Photo, self).save(*args, **kwargs)
"""Get EXIF"""
im = Image.open(self.image.path)
try:
info = im.getexif()[0x010e]
self.info = info
except KeyError:
pass
"""Save image dimensions."""
im = Image.open(pjoin(MEDIA_ROOT, self.image.name))
self.width, self.height = im.size
im.save(self.image.path)
super(Photo, self).save(*args, **kwargs)
def __str__(self):
return self.title
def albums_(self):
lst = [x[1] for x in self.albums.values_list()]
return ",".join(lst)
def size(self):
return "%s x %s" % (self.width, self.height)```
Спасибо за эту информацию, очень признателен. Но я фактически перешел на S3, который дал мне те же проблемы, но с более полными сообщениями об ошибках, чтобы я мог решить проблему.
self.image.path в методе сохранения модели было проблемой. Я просто изменил его на
self.image и все заработало. Проблема заключалась в использовании absolute path к объекту, который не поддерживается S3 или, как я предполагаю, Cloudinary.