AppEngine/PythonでDjangoのImageFieldを使う
画像のアップロード機能なんかをつけるとき、
Django付属のImageFieldを利用すると、
適切な画像かどうかを処理してくれるので便利なのですが、
AppEngineにはPILがないのでうまくいきません。
実際ImageFieldを使ってみると
No module named Image
のようなエラーが出て開発、本番ともに失敗してしまいます。
チラ裏:
https://developers.google.com/appengine/docs/python/images/installingPIL
最初このページを見てAppEngineでPILが使えると誤解してしまったため解決に時間がかかりました‥
実際は、AppEngineではPILが使えず、代わりに画像用のAPIが公開されています。
開発用のAppEngineサーバーではこのAPIをエミュレートするためにPILを入れてね、というのが正解です。
PILのインストール方法とかをずっと疑ってました‥。
ダミーPILの導入
DjangoのフレームワークはAppEngine純正のを使うと弄ることができないので、
自分で処理書かなくてはならないのかと思ったのですが、
ググってたら解決策が見つかりました。
Djangoが使っているPILの機能を、
AppEngineのAPIでラップしたダミーを作るという解決策です。
これならDjangoのコアをいじらずにImageFieldが利用できます。
使い方
PIL/init.py
上にソースがあります。
AppEngineのアプリケーションのルートにPILというフォルダを作成し、
そこに上記のinit.pyを作成すれば準備完了です。
あとは通常のDjangoと同じようにImageFieldが利用できます。