たにしきんぐダム

プログラミングやったりゲームしてます

django-imagekit使ってみた

djangoに画像をアップロードする際、自動でリサイズとかしたいときにdjango-imagekitを使うと便利らしい。

django-imagekit

github.com

インストール

githubのリンクに書いてある通り。

pip install pillow
pip install django-imagekit

settings.pyのINSTALLED_APPSに'imagekit'を追加

ImageSpecField

ImageFieldにアップロードした画像のサムネを作りたいときなんかはImageSpecFieldを使う。
githubのreadmeのままだけど…

from django.db import models
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFill

class Profile(models.Model):
    avatar = models.ImageField(upload_to='avatars')
    avatar_thumbnail = ImageSpecField(source='avatar',
                                      processors=[ResizeToFill(100, 50)],
                                      format='JPEG',
                                      options={'quality': 60})

avatarは普通にImageFieldを使って定義したもの。ImageSpecFieldの引数の意味はなんとなく分かると思う。sourceは元になるImageField、アップロード先は指定する必要ないです。
ImageSpecFieldは仮想的な(?)もので実際にデータベースに'avatar_thumnail'という列は作らない。
これでProfile.avatarに画像をアップロードした際に自動的にリサイズされjpg変換されたサムネ画像が生成される。

サムネ画像の保存先

そのサムネ画像が生成される場所はデフォルトだと,settings.pyで設定したMEDIA_ROOTの相対パスi'CACHE/images/upload_to'になるっぽい。

例えばsettings.pyにおいて

MEDIA_ROOT = 'home/tanishiking/django_project/cms/media/'

の場合、保存先は

home/tanishiking/django_project/cms/media/CACHE/images/avatar/filename.jpg

これはsettings.pyでIMAGEKIT_CACHEFILE_DIRをいじくることで変えられる。

テンプレート側でサムネ画像を呼び出すときは

<img src="{{ profile.avatar_thumbnail.url }}" />

で呼び出せる。

トラブルシューティング

サムネ画像が生成されない

サムネ画像の保存先のディレクトリが無くて作られなかった?

python manage.py generateimages

でディレクトリ、画像が作られて、その後は普通にサムネ画像が作られるようになった。

error decoder jpeg not available

python manage.py generateimages

しようとするとこんなエラーが出る。

jpegをpillowで扱うときはpillowのコンパイル時にlibjpeg-devが必要っぽい。
libjpeg-devをインストールしてからpillowを再インストールしたら治った

sudo apt-get install libjpeg-dev
pip install -I pillow

(ubuntu-14.04)

vimプラグインをneobundleで管理してdotfilesをgithubで管理した

最近いろいろあってvimを使い始めた。
自宅のPCとかバイト先のPCで.vimrcとかプラグインを共有したいなあと思っていたのですが、.vimrc とか.bashrcの様なファイルをdotfilesとしてまとめて、 GitHubで管理すると良いみたいです。
Vimプラグイン管理にはneobundleを使うと良いみたい。

こちらの記事が詳しいです。dotfilesをGitHubで管理,vimプラグインをNeoBundleで管理する方法メモ - Programming Log

Git - Vim入門記 - Qiita


無事設定が済みdotfilesをgithubにpushしまして、バイト先のPCからcloneして使おうと思ったときに上手くいきませんでした。
まずはdotfilesをcloneして利用するときの手順を述べます。

別の環境でdotfilesをcloneして利用する時の方法

まずはgithubからdotfilesをcloneします。

cd ~/
git clone https://github.com/youraccount/dotfiles.git

サブモジュールを含んだプロジェクトをcloneするとサブモジュールを含むディレクトリは取得できますがその中にはまだ何もファイルが入っていません。.vim/bundle/neobundle.vim/ 以下が空っぽです。
以下のコマンドでneobundle.vimを有効にします。

git submodule init
git submodule update

最後にシンボリックリンクを張ります。

cd ~/
ln -sf dotfiles/.zshrc .zshrc
ln -sf dotfiles/.vimrc .vimrc
ln -sf dotfiles/.vim .vim

など、他に管理したドットファイルがあったら適宜追加する感じです。

これらの作業が完了したら.vimrcなり何なりをvimで開いて

:NeoBundleInstall

プラグインをインストールします。これでgithubにあったdotfilesを利用できます。

どこで詰んだか

No submodule mapping found in .gitmodules for path '.vim/bundle/plugin_name'

git submodule initしようとするとこれが出た。
git rm --cached .vim/bundle/plugin_name
で各プラグインをgit管理から外してやればgit submodule init できますが、これでは次は以下のエラーに遭遇しました。

You may have used the wrong bundle name, or all of the bundles are already installed.

上記のエラーを解決したは良いのですが
:NeoBundleInstall
をしようとすると、このようなことを言われるますが、プラグインはインストールされてないっぽい。

原因

.gitignoreを書き忘れていました。以下のように記述してやる。

.vim/bundle/*
!.vim/bundle/neobundle.vim

neobundleによってインストールされたプラグインは.vim/bundle/ 以下に納められるのですが、それらのプラグインgithub管理してしまうと、クローンした先でNeoBundleInstallしようとしてもクローンしてきたプラグインがあるので「インストール済だよ!」と言われます。クローンしてきたプラグインは何か使えないみたいですね。

    • -