如何为Django中的sorthumbnail设计清理任务?

2024-04-27 00:29:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是sorl缩略图,它提供给定图像的缓存缩略图。 我想删除原始图像更改或删除时生成的拇指。 我知道sorl thumbnail为这种情况提供了一种删除方法,但是。。在

  • 它不会通过django admin触发
  • 可能是比赛条件不好的原因
  • 当使用像redis这样的kv存储时,所有数据(文件连接)可能都不见了(例如重新启动)

更适合的是sorl清理管理命令。此命令将删除原始链接和相关物理拇指断开的kv条目。但是如果我的kv存储不完整怎么办?我不想到处都是死文件。在

我考虑过一个celery任务,它将触发cleanup命令并额外检查所有缓存的文件,但不知道如何设计它。在

什么是最好的方法来检测和清理这些乱七八糟的东西?在


Tags: 文件django方法图像命令redisadmin情况
1条回答
网友
1楼 · 发布于 2024-04-27 00:29:45

您可以向模型中添加方法clear\u thumbnails()。在clear\u thumbnails()中,使用来自sorl缩略图的delete function删除现有缩略图。如果下次使用{% thumbnail %}模板标记呈现视图,则会创建新的缩略图。在

现在添加一个函数,该函数在调用与缩略图相关的模型的pre_save signal时运行。在这个函数中,您可以简单地调用clear\u thumbnails()

使用这种方法,当您在Django admin中更改模型时,缩略图也将被删除。(您也可以捕捉到pre_delete信号)

像这样:

## models.py ##
from django.db import models
from sorl.thumbnail import delete as delete_thumbnails

class Route(models.Model):
    ...
    def clear_thumbnails(self):
        delete_thumbnails(self.image)

## receivers.py ##
from django.db.models.signals import pre_save

@receiver(pre_save, sender=YourModel)
def receive_yourmodel_pre_save(sender, **kwargs):
    sender.clear_thumbnails()

现在,您有了一个模型,每当模型更改时,它都会删除缩略图。(如果图像字段已更改,则可能您应该在接收器中添加一个检查,如果图像字段发生更改,则只删除缩略图)

如果你有很多缩略图,那么sorl缩略图的管理命令就没有用了。我在sorl缩略图键值存储中有几百万个条目,而管理命令从未完成。在

最后,我自己编写了一个比sorl缩略图提供的脚本更好的清理脚本,因为它不占用太多内存,而且还显示了一个进步。像这样:

^{pr2}$

我将这个清理脚本设置为RunScript as defined the Django extensions。查看Django扩展和RunScript部分。这很方便。在

希望这有帮助。在

相关问题 更多 >