我使用的是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部分。这很方便。
希望这能有所帮助。