跳转至

Django-cleanup 清理文件

安装

pip install django-cleanup

配置

INSTALLED_APPS = (
    ...
    'django_cleanup',
)

信号

from django_cleanup.signals import cleanup_pre_delete, cleanup_post_delete

def sorl_delete(**kwargs):
    print(kwargs['file'])

cleanup_pre_delete.connect(sorl_delete)

作用

  1. 在django实例中的file、image字段内容被更新时,旧的文件将被自动删除。
  2. 在django实例被删除时,实例包含的所有file、image将被自动删除。

默认头像被删除的问题

默认头像不使用default,使用null=True,获取头像使用方法:

def display_avatar(self):
    return self.avatar.url or '/static/img/default-avatar.png'

详见https://github.com/un1t/django-cleanup/issues/8

缩略图兼容:

兼容缩略图生成工具:sorl-thumbnail and easy-thumbnail

https://github.com/un1t/django-cleanup

修改分辨率

profile = Message.objects.get(id=5)
media_root = getattr(settings, 'MEDIA_ROOT', None)
path = os.path.join(os.path.join(media_root, ''), profile.portrait1.name)
# 修改头像分辨率
from PIL import Image
im = Image.open(path)
out = im.resize((200, 200), Image.ANTIALIAS)
out.save(path)

使用django-imagekit生成缩略图:

方法一:

avatar_thumbnail = ImageSpecField(source='portrait1',
                                  processors=[ResizeToFill(200, 200)],
                                  format='PNG',
                                  options={'quality': 100})
print(profile.avatar_thumbnail.url)  # > /media/CACHE/images/982d5af84cddddfd0fbf70892b4431e4.jpg
print(profile.avatar_thumbnail.width)

无法使用django-cleanup自动删除生成的Cache文件

方法二:

from imagekit import ImageSpec
from imagekit.processors import ResizeToFill

class Thumbnail(ImageSpec):
    processors = [ResizeToFill(200, 200)]
    format = 'JPEG'
    options = {'quality': 100}
source_file = profile.portrait1
image_generator = Thumbnail(source=source_file)
result = image_generator.generate()
print(result, type(result))
dest = open(path, "wb+")
dest.write(result.read())
dest.close()

缩略图覆盖原文件或者直接保存至其他文件。

同尺寸生成同尺寸的缩略图会变模糊,但远优于使用PIL-Image修改分辨率生成的图片质量。

sorl-thumbnail

安装

pip install sorl-thumbnail

配置

INSTALLED_APPS = (
    ...
    'sorl.thumbnail',
)

No Such Table 错误

python manage.py makemigrations thumbnail
python manage.py migrate thumbnail

获取及删除缩略图

from sorl.thumbnail import get_thumbnail
from sorl.thumbnail import delete

im = get_thumbnail(my_file, '100x100', crop='center', quality=99)
delete(my_file)

配合django-cleanup

from django_cleanup.signals import cleanup_pre_delete, cleanup_post_delete

def sorl_delete(**kwargs):
    from sorl.thumbnail import delete
    delete(kwargs['file'])

cleanup_pre_delete.connect(sorl_delete)