2

私は2つの画像フィールドを持つ写真のモデルを持っています。 1つは元のイメージ用で、もう1つは元のイメージのサイズ変更されたバージョン用です。私はすでにのWebSocketの目的のためにそれを使用していたので、私はジャンゴ-channlesを選んだ画像のサイズを変更するためのDjangoチャンネル

class Photo(models.Model): 
    user = models.ForeignKey(User) 
    image_original = models.ImageField(
     upload_to=get_upload_file_name, 
     width_field="image_original_width", 
     height_field="image_original_height", 
     blank=True 
    ) 
    image_original_width = models.IntegerField(default=0) 
    image_original_height = models.IntegerField(default=0) 
    image_470 = models.ImageField(
     upload_to=get_upload_file_name, 
     width_field="image_470_width", 
     height_field="image_470_height", 
     blank=True 
    ) 
    image_470_width = models.IntegerField(default=0) 
    image_470_height = models.IntegerField(default=0) 

理由があって、ドキュメントに彼らは」を言った...そして、それを超えて、非クリティカルなタスクがたくさんありますそのアプリケーションは、レスポンスが送信されるまで(キャッシュに保存する、新しくアップロードされた画像をサムネイルするなど)、簡単にオフロードできます。

は、どのように私は470pxの幅とSORLサムネイルまたはジャンゴ・imagekitまたは他の方法でを使用して、自動高さを持つように画像のサイズを変更するジャンゴ・チャンネルを使用することができますか?

+1

画像のサイズを変更する際のチャンネルの仕組みはわかりません。あなたはなぜこの作業を行うためにジャンゴチャンネルを使いたいのですか、それをどういう意味ですか?また、あなたはsorl-thumbnailで死んでいますか?同じイメージの異なるバージョンのための別々のモデルフィールドを持つモデルは、より多くのdjango-imagekitの路地に見えます。 –

+0

@ LudwikTrammer django-imagekitは有望そうです。ありがとうございました。私は間違いなくこれを試してみるだろう。そして私がdjango-channlesを選んだのは、私がwebsocketの目的のためにすでに使っていたからです。そして、彼らは次のように言っていました。 "そして、それ以外にも、物事をキャッシュに保存したり、新しくアップロードした画像をサムネイルするように送信されました。 " – Karl

+0

ありがとうございます。この情報をオリジナルの質問に追加することをお勧めします。 –

答えて

0

sorl-thumbnailを使用する場合は、モデルコードで何もする必要はありません。

class Photo(models.Model): 
    user = models.ForeignKey(User) 
    image = models.ImageField(
     upload_to=get_upload_file_name, 
     width_field="width", 
     height_field="height", 
     blank=True 
    ) 
    width = models.IntegerField(default=0) 
    height = models.IntegerField(default=0) 

をそして、あなたは470pxの画像を必要なときに、あなたのテンプレートで、次のように行います:ちょうどこのようなクラスを持っていることをだ

{% load thumbnail %} 
... 

{# Specifying width only here. #} 
{# If you want a height constraint as well use e.g. "470x1000". #} 
{% thumbnail photo.image "470" as im %} 
    <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> 
{% endthumbnail %} 

- SORLサムネイルが残りの世話をします(スケーリング最初の要求時に、キャッシュを処理するなど)。オンデマンドで動作します。つまり、テンプレートタグに遭遇したときの最初のアクセスでサイズ変更が行われます。通常は問題ありません。あなたが覚えておかなければならないのは、ストレージが遅い場合には、サムールサムネイルがうまく動作しないことだけです。ローカルドライブにメディアを保存する場合は問題ありません。あなたのストレージバックエンドが、例えば、Amazon S3なら - それをしないでください。

これの便利な部分は他のサムネイルサイズを必要とすることでしょう。必要なのは、テンプレートコードの中で必要なものをsorl-thumnailに伝えるだけです。モデルの変更は必要ありません。

サムネイルがsorl-thumbnailで事前生成されていることを確認するには、get_thumbnailを明示的に呼び出すか、たとえば、あなたのためにget_thumbnail(結果を無視する)を実行するCeleryタスクです。

@app.task 
def ensure_thumbnail(photo_pk, size="470"): 
    photo = Photo.objects.get(pk=photo_pk) 
    get_thumbnail(photo.image, size) 

新しいアップロードが表示されたら、ensure_thumbnail.delay(photo.pk)に電話してください。

詳細については、the examplesを必ず確認してください。


あなたがこれを感じた場合は、このアプローチは、あなたがすべき事をする方法はないか、ジャンゴ・imagekitを使用し、その後ゆっくりとストレージを持っています。私はずっとそれに慣れ(生産に自分自身を使用していない)ないんだけど、ドキュメントに基づいて、それは次のようになります。

あなたのモデルは次のようになります。

from imagekit.models import ImageSpecField 
from imagekit.processors import ResizeToFit 
... 

class Photo(models.Model): 
    user = models.ForeignKey(User) 
    image_original = models.ImageField(
     upload_to=get_upload_file_name, 
     width_field="image_original_width", 
     height_field="image_original_height", 
     blank=True 
    ) 
    image_original_width = models.IntegerField(default=0) 
    image_original_height = models.IntegerField(default=0) 
    # I haven't found a way to not specify the height. 
    image_470 = ImageSpecField(source="image_original", 
           processors=[ResizeToFit(470, 1000)], 
           format="JPEG") 

(同様SORLサムネイル独自のデータベースフィールドを持つ完全に管理された独立したイメージファイルが絶対に必要な場合は、裸のピローライブラリを使用してPhoto.saveにサムネイルを明示的に生成することをお勧めします。)

そして、それは単なると簡単です:

<img src="{{ photo.image_470.url }}" 
    width="{{ photo.image_470.width }}" 
    height="{{ photo.image_470.height }}" 
    alt="..." /> 

キャッシュがどのように機能するかを説明してドキュメントon cachingを(チェックアウトすると、非同期thumnailsを生成するために、必ず、あなたはそれをこのようにしたいもの)。

関連する問題