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)
作用
- 在django实例中的file、image字段内容被更新时,旧的文件将被自动删除。
- 在django实例被删除时,实例包含的所有file、image将被自动删除。
默认头像被删除的问题
默认头像不使用default,使用null=True,获取头像使用方法:
详见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
安装
配置
No Such Table 错误
获取及删除缩略图
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