2012-06-20 2 views
2

В моем проекте у меня есть модель, где я использую Imagekit для обработки изображения. Когда я сохраняю изображение У меня есть следующие требования:Imagekit - изображение кэша не удаляется после удаления оригинала

  • переименования изображения и пиктограммы на уникальное имя
  • , когда новое изображение загружается, старый должен быть удален (и эскиз в кэше должны освежить в новое изображение).

Для этого я использую следующий код:

Модель:

def generate_cache_filename(instance, path, specname, extension): 
    extension = '.jpg' 
    return 'cache/images_upload/%s_%s%s' % (instance.pk, specname, extension) 

def generate_image_filename_1(instance, filename): 
    filename = '1' 
    extension = '.jpg' 
    return 'images_upload/%s_%s%s' % (instance.pk, filename, extension) 

class Model(models.Model): 
    name = models.CharField(max_length=40) 
    image_1 = ProcessedImageField([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(500, 370)], upload_to=generate_image_filename_1, format='JPEG', options={'quality': 90}) 
    thumbnail_1 = ImageSpec([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(83, 78)], image_field='image_1', cache_to=generate_cache_filename, format='JPEG', options={'quality': 90}) 

Форма (удалить изображение, когда оно заменяется новым):

if form.is_valid(): 
    form_image = form.cleaned_data['image_1'] 
     try: 
      details = Model.objects.get(pk=pk) 
      if details.image_1 != form_image: 
       details.image_1.delete(save=False) 
     except Model.DoesNotExist: 
      pass 
     form.save() 

Часть переименования изображений и замена image_1 (= загрузка новых и удаление старых) работает отлично. Но по какой-то причине thumbnail_1 в кеше не обновляется (= по-прежнему является миниатюром старого изображения).

Я думаю, что это как-то связано с кодом удаления в форме, но я не могу понять, почему и как его решить. Кто-то с предложениями?

ОБНОВЛЕНИЕ 1: это также имеет отношение к «переименованию». Я сделал несколько дополнительных тестов: когда я не переименую файл image_1, все работает отлично (также освежает миниатюру). Но когда я загружаю другое изображение с тем же именем, у меня такая же проблема: image_1 обновлен, но thumbnail_1 по-прежнему является миниатюрой старого изображения.

UPDATE 2: сделал еще несколько тестов и при загрузке нового изображения с тем же именем, я определенно ввести if statement в try. Таким образом, старое изображение удаляется. Согласно документации Imagekit, миниатюра также должна быть удалена. Но это не так.

Большое спасибо!

+0

Обновление: сделал еще несколько тестов и при загрузке нового изображения с тем же именем, я определенно ввести 'если statement' в' try'. Таким образом, старое изображение удаляется. Согласно документации Imagekit, миниатюра также должна быть удалена. Но это не так. –

ответ

1

В то же время я нашел рабочее решение. Основная причина, по которой приведенный выше код не работал, - это из-за эскиза в кеше, который не был удален после удаления исходного изображения, особенно в тех случаях, когда новое изображение имело то же имя файла, что и предыдущее =>, а затем миниатюра никогда не удалялся. => Я до сих пор не знаю, почему ..., потому что я ожидал, что кешированное изображение всегда будет удалено, когда исходный текст будет удален.

Используя следующий код все работает, как ожидалось: В основном я убедился, что новый загружаемый образ всегда имеет другое имя файла:

Model.py

def generate_cache_filename(instance, path, specname, extension): 
    extension = '.jpg' 
    return 'cache/images_upload/%s_%s%s' % (instance.pk, specname, extension) 
# generate random string of 10 characters 
def id_generator(size=10, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for x in range(size)) 

def generate_random_filename(instance, filename): 
    filename = id_generator() 
    extension = '.jpg' 
return 'images_upload/%s_%s%s' % (instance.pk, filename, extension) 

class Model(models.Model): 
    name = models.CharField(max_length=20) 
    image_1 = ProcessedImageField([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(500, 370)], upload_to=generate_random_filename, format='JPEG', options={'quality': 90}) 
    thumbnail_1 = ImageSpec([Adjust(contrast=1.2, sharpness=1.1), ResizeToFill(83, 78)], image_field='image_1', cache_to=generate_cache_filename, format='JPEG', options={'quality': 90}) 

View.py:

# thanks to jdi for the help in the for-loop 
if form.is_valid(): 
     # A for loop is used here, because my database contains 5 images and 5    thumbnails 
     image_list = ['image_%d' % i for i in xrange(1,6)] 
     for image_name in image_list: 
      form_image = form.cleaned_data[image_name] 
      try: 
       details = Model.objects.get(pk=pk) 
       if getattr(details, image_name, None) != form_image: 
        getattr(details, image_name, None).delete(save=False) 
      except Model.DoesNotExist: 
       pass 

Надеюсь, это поможет другим людям.

С наилучшими пожеланиями

Смежные вопросы