如何在django中为sorl缩略图设计清理任务



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

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

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

我想到了一个芹菜任务,它将触发cleanup命令并额外检查所有缓存的文件,但不知道如何设计。

检测和清理混乱的最佳方法是什么?

您可以将方法clear_thumbnails()添加到模型中。在clear_thumbnails()中,您使用sorl缩略图中的delete函数来删除现有缩略图。如果下次使用{% thumbnail %}模板标记渲染视图时,将创建新的缩略图。

现在添加一个函数,该函数在调用与缩略图相关的模型的pre_save信号时运行。在这个函数中,您只需调用clear_thumbnails()

使用这种方法,当您在Django管理中更改模型时,缩略图也将被删除。(您也可以捕捉到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()

现在,您有了一个模型,只要模型发生更改,就会删除缩略图。(如果图像字段发生更改,则如果pre_save或postrongave信号发生更改,您可能应该在接收器中添加一个复选框,如果发生这种情况,则仅删除缩略图)

如果你有很多缩略图,那么sorl缩略图的管理命令是无用的。我在sorl缩略图键值存储中有几百万个条目,管理命令永远不会完成。

我最终写了我自己的小清理脚本,它比sorl缩略图提供的脚本更好,因为它不占用太多内存,而且还显示了进度。类似这样的东西:

function clean_thumbnails(self):
    max_id = MyModel.objects.all().order_by('-pk')[0].pk
    for id in xrange(max_id, 0, -1):
        try:
            my_obj = MyModel.objects.get(pk=id)
            my_obj.clear_thumbnails()
            print "processed object with id %s" % id
        except MyModel.DoesNotExist:
            pass

我将这个清理脚本设置为Django扩展定义的RunScript。查看Django扩展和RunScript部分。这很方便。

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新