加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django – sorl-thumbnail不会删除缩略图

发布时间:2020-12-20 13:03:46 所属栏目:Python 来源:网络整理
导读:在覆盖文件时遇到SORL缩略图问题并删除缩略图文件或刷新缩略图.场景是我有一个文件,每个条目总是相同但可以覆盖.上传新文件并覆盖旧文件时,需要重新创建缩略图. 这是在模型表单级别,所以我使用低级API生成大拇指. 尝试过使用: from sorl.thumbnail import d
在覆盖文件时遇到SORL缩略图问题并删除缩略图文件或刷新缩略图.场景是我有一个文件,每个条目总是相同但可以覆盖.上传新文件并覆盖旧文件时,需要重新创建缩略图.

这是在模型表单级别,所以我使用低级API生成大拇指.

尝试过使用:

from sorl.thumbnail import delete

delete(filename)

但是没有成功,缩略图永远不会被删除或覆盖.

我甚至尝试过:

from sorl.thumbnail.images import ImageFile
from sorl.thumbnail import default

image_file = ImageFile(filename)
default.kvstore.delete_thumbnails(image_file)

再次没有成功.

请帮忙!

更新:

我通过创建备用ThumbnailBackend和新的_get_thumbnail_filename方法找到了解决方法.新方法使用文件的SHA-1哈希来始终具有特定于当前文件的缩略图.

这是可能遇到类似场景的其他任何人的后端.

class HashThumbnailBackend(ThumbnailBackend):

  def _get_thumbnail_filename(self,source,geometry_string,options):
    """
    Computes the destination filename.
    """
    import hashlib

    # hash object
    hash = hashlib.sha1()

    # open file and read it in as chunks to save memory
    f = source.storage.open(u'%s' % source,'rb')
    while True:
      chunk = f.read(128)
      if not chunk:
        break
      hash.update(hashlib.sha1(chunk).hexdigest())

    # close file
    f.close()

    hash.update(geometry_string)
    hash.update(serialize(options))
    key = hash.hexdigest()

    # make some subdirs
    path = '%s/%s/%s' % (key[:2],key[2:4],key)
    return '%s%s.%s' % (settings.THUMBNAIL_PREFIX,path,self.extensions[options['format']])

解决方法

它有点难以解释所以我做了这个很棒的表.下面列出了第一列的命令,其他列标记了它是否使用X删除.原始文件是原始文件,缩略图是原始缩略图,KV表示键值存储引用.

| Command | Original | Thumbnails | KV Original | KV Thumbnails |
| #1      | X        | X          | X           | X             |
| #2      |          | X          |             | X             |
| #3      |          | X          | X           | X             |

> sorl.thumbnail.delete(文件名)
> sorl.thumbnail.default.kvstore.delete_thumbnails(image_file)
> sorl.thumbnail.delete(filename,delete_file = False)

据我所知,你真的想做#3.现在,你的问题…猜测是文件名不引用相对于MEDIA_ROOT的文件名(如果你使用另一个存储后端,情况会类似).但是我想我需要知道你在做什么除了这个以获得更好的图片,注意ImageFields和FileFields不会覆盖,还要注意django改变了1.2.5中的删除行为,请参阅发行说明.

更新:阅读此内容的任何人都应该注意,上面生成缩略图文件名的方式效率非常低,如果您关心性能,请不要使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读