Django Imagekit 如何覆盖 cachefile_name?
我想要覆盖模块django-imagekit中的cachefile_name
属性。
这是我的代码:
class Thumb150x150(ImageSpec):
processors = [ResizeToFill(150, 150)]
format = 'JPEG'
options = {'quality': 90}
@property
def cachefile_name(self):
# simplified for this example
return "bla/blub/test.jpg"
register.generator('blablub:thumb_150x150', Thumb150x150)
class Avatar(models.Model):
avatar= ProcessedImageField(upload_to=upload_to,
processors=[ConvertToRGBA()],
format='JPEG',
options={'quality': 60})
avatar_thumb = ImageSpecField(source='avatar',
id='blablub:thumb_150x150')
但是完全不管用。
当我调试的时候(不使用我对cachefile_name
的覆盖),查看cachefile_name
的返回值,结果是一个像“CACHE/blablub/asdlkfjasd09fsaud0fj.jpg”这样的字符串。我哪里出错了呢?
有没有什么想法?
2 个回答
1
我觉得,正确的方法是设置 IMAGEKIT_SPEC_CACHEFILE_NAMER。可以看看默认的命名方式 names.py,它是把设置中的 IMAGEKIT_CACHEFILE_DIR 和文件路径还有哈希值结合在一起,你也可以这样做。
4
我尽量把这个例子复现了一下,结果很好。这里有几个建议:
1) 确保你在视图中使用了avatar_thumb。文件"bla/blub/test.jpg"只有在那时才会生成。
2) 检查一下你的MEDIA_ROOT配置,确保你知道"bla/blub/test.jpg"应该出现在哪里。
让我举个我正在做的类似例子。我想给我的缩略图起个独特的名字,这样可以从原始文件名中推测出来。Imagekit默认的命名方式是根据一个哈希值来给缩略图命名,这个我没法猜出来。比如,我不想要这样的:
media/12345.jpg
media/CACHE/12345/abcde.jpg
我想要这样的:
media/photos/original/12345.jpg
media/photos/thumbs/12345.jpg
覆盖IMAGEKIT_SPEC_CACHEFILE_NAMER并没有成功,因为我不想让所有的缓存文件都放在"thumbs"目录下,只想让特定模型中特定字段生成的文件放在那里。
所以我创建了这个ImageSpec子类并注册了它:
class ThumbnailSpec(ImageSpec):
processors=[Thumbnail(200, 200, Anchor.CENTER, crop=True, upscale=False)]
format='JPEG'
options={'quality': 90}
# put thumbnails into the "photos/thumbs" folder and
# name them the same as the source file
@property
def cachefile_name(self):
source_filename = getattr(self.source, 'name', None)
s = "photos/thumbs/" + source_filename
return s
register.generator('myapp:thumbnail', ThumbnailSpec)
然后在我的模型中这样使用它:
# provide a unique name for each image file
def get_file_path(instance, filename):
ext = filename.split('.')[-1]
return "%s.%s" % (uuid.uuid4(), ext.lower())
# store the original images in the 'photos/original' directory
photoStorage = FileSystemStorage(
location=os.path.join(settings.MEDIA_ROOT, 'photos/original'),
base_url='/photos/original')
class Photo(models.Model):
image = models.ImageField(storage=photoStorage, upload_to=get_file_path)
thumb = ImageSpecField(
source='image',
id='myapp:thumbnail')