4

SORL Thumbnail に問題があり、ファイルが上書きされたときにサムネイル ファイルを削除したり、サムネイルを更新したりします。シナリオは、各エントリが常に同じであるが上書きできるファイルがあるということです。新しいファイルがアップロードされ、古いファイルが上書きされたときに、サムネイルを再作成する必要があります。

これはモデル + フォーム レベルであるため、低レベル API を使用してサムを生成しています。

使用してみました:

from sorl.thumbnail import delete

delete(filename)

しかし成功しなければ、サムネイルは決して削除されたり上書きされたりしません。

私も試しました:

from sorl.thumbnail.images import ImageFile
from sorl.thumbnail import default

image_file = ImageFile(filename)
default.kvstore.delete_thumbnails(image_file)

再び成功しませんでした。

助けてください!

アップデート:

別の ThumbnailBackend と新しい _get_thumbnail_filename メソッドを作成することで回避策を見つけました。新しい方法では、ファイルの SHA-1 ハッシュを使用して、現在のファイルに固有のサムネイルを常に保持します。

同様のシナリオに遭遇する可能性のある他の人のためのバックエンドを次に示します。

class HashThumbnailBackend(ThumbnailBackend):
  
  def _get_thumbnail_filename(self, source, geometry_string, options):
    """
    Computes the destination filename.
    """
    import hashlib
    
    # hash object
    hash = hashlib.sha1()
    
    # open file and read it in as chunks to save memory
    f = source.storage.open(u'%s' % source, 'rb')
    while True:
      chunk = f.read(128)
      if not chunk:
        break
      hash.update(hashlib.sha1(chunk).hexdigest())
    
    # close file
    f.close()
    
    hash.update(geometry_string)
    hash.update(serialize(options))
    key = hash.hexdigest()
    
    # make some subdirs
    path = '%s/%s/%s' % (key[:2], key[2:4], key)
    return '%s%s.%s' % (settings.THUMBNAIL_PREFIX, path,
                        self.extensions[options['format']])
4

4 に答える 4

17

説明するのが少し難しいので、この素晴らしい表を作成しました。最初の列のコマンドを以下に示します。他の列は X を使用して削除するかどうかを示します。オリジナルはオリジナル ファイル、サムネイルはオリジナルのサムネイル、KV はキー値ストアの参照を意味します。

| Command | Original | Thumbnails | KV Original | KV Thumbnails |
| #1      | X        | X          | X           | X             |
| #2      |          | X          |             | X             |
| #3      |          | X          | X           | X             |
  1. sorl.thumbnail.delete(filename)
  2. sorl.thumbnail.default.kvstore.delete_thumbnails(image_file)
  3. sorl.thumbnail.delete(filename, delete_file=False)

私が理解しているように、あなたは本当に #3 をやりたいと思っています。さて、あなたの問題...推測は、filename相対的なファイル名を参照していないことMEDIA_ROOTです(別のストレージバックエンドを使用している場合、状況は同様になります)。しかし、より良い全体像を得るために、これ以外に何をしているのかを知る必要があると思います。ImageFields と FileFields は上書きされないことに注意してください。また、django が 1.2.5 で削除動作を変更したことにも注意してください。リリース ノートを参照してください。

更新: これを読んでいる人は、サムネイルのファイル名を生成する上記の方法は非常に非効率的であることに注意してください。パフォーマンスが気になる場合は使用しないでください。

于 2011-02-23T00:08:49.860 に答える
6

これがあなたの質問に答えているかどうかは完全にはわかりませんが、私は同じ問題を抱えていて、これが私の解決策でした.

次のような FileField を持つモデルがあります。

material = models.FileField(upload_to='materials')

アップロードされたファイルを処理するときは、get_thumbnail() を使用してサムネイルを生成し、FileField をパラメーターとして渡すのに対し、その背後にある Python レベルのファイルを渡します。すなわち:

thumb = get_thumbnail(modelinstance.material, '%dx%d' % (thumb_width, thumb_height))

あなたの問題と同様に、ファイルが同じ名前の場合、sorl は新しいサムネイルを生成する代わりにキャッシュからサムネイルを取得することもわかりました。悪化する!

うまくいったのは、sorlのdeleteメソッドを使用してFileFieldを渡すことでした。私は最初に FileField オブジェクトの背後にある python ファイルを渡そうとしましたが、これはおそらくあなたが試みていたことですか? これから行く:

sorl.thumbnail.delete(modelinstance.material.file)

これに:

sorl.thumbnail.delete(modelinstance.material)

sorl-thumbnail の KV ストアと一致しているようで、キャッシュされたサムネイルを適切に取り除き、新しいファイルから新しいサムネイルを作成できるようにしました。わーい!

これは私にとって役に立ちました: http://sorl-thumbnail.readthedocs.org/en/latest/operation.html

また、./manage.py サムネイル クリーンアップと ./manage.py サムネイル クリアを実行した後でも、Django に同じ場所で古いサムネイルの検索を停止させることができませんでした。Django キャッシュを手動でクリアする必要がありました (memcached を使用しています)。これを行う方法は次のとおりです。

import os

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "yourproject.settings"

from django.core.cache import cache

# Flush!
cache._cache.flush_all()

これは私の最初のSOの答えです。それが誰かを助けることを願っています:)

于 2012-11-15T23:21:32.567 に答える
1

この問題を見ました。変な使い方をされていたために起こっていSorlました。

すべてのサムネイルは次のスタイルで取得されました。

sorl.thumbnail.get_thumbnail(self.picture.url, geometry_string, **options)
# picture being a FieldFile

そして、サムネイルを削除する(キャッシュから削除する)ときは、次のように行われていました:

sorl.thumbnail.delete(self.picture.name, delete_files=False)

まもなく、画像のURLを使用してサムネイルを生成および取得し、削除するときに画像の名前を使用していました。Sorl不満はありませんでしたが、KV ストアと FS は決してクリーンアップされませんでした。

修正は、get_thumbnailname 引数を に変更するだけでしたself.picture.name

于 2014-09-04T21:16:07.513 に答える