2

cachefile_nameモジュール django-imagekit からプロパティを上書きしようとしています。

これが私のコードです:

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" のような文字列になります。私の間違いはどこですか?

何か案は?

4

2 に答える 2

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')
于 2015-08-10T09:07:34.247 に答える
1

正しい方法はIMAGEKIT_SPEC_CACHEFILE_NAMERを設定することだと思います。default namer names.pyを見てください。ファイルパスとハッシュを使用して settings.IMAGEKIT_CACHEFILE_DIR を結合します。おそらく同じことを行う必要があります。

于 2014-04-24T14:39:56.497 に答える