GoogleAppEngine用フレームワーク Kay で画像ファイルをアップロードする

GoogleAppEngine用フレームワーク Kay で画像ファイルをアップロードする | 山本隆の開発日誌」より。

Google App EngineフレームワークKayを使い、画像ファイルをアップロードする方法。

画像を保存するためのモデルを用意します。

アップロードされた画像を保存するためのBlobPropertyを用意します。

class ThumbnailImage(db.Model):
thumbnail = db.BlobProperty()

アップロードのためのフォームを作成します。

ファイルをアップロードするにはFileFieldを使用します。

class UploadForm(forms.Form):
upload_file = forms.FileField(u'画像ファイル', required=True)

フォームのvalidate()では、引数にrequest.formに加えて、request.filesを指定します。

(参考:11.7. ファイルアップロード — Kay v0.10.0 documentation)

if request.method == 'POST' and form.validate(request.form, request.files):

Images Python APIを使用して、画像を編集します。

uploaded_image = images.Image(form['upload_file'])
uploaded_image.resize(width=100) #幅
thumbnail = uploaded_image.execute_transforms(output_encoding=images.JPEG)

画像データを保存します。

image = ThumbnailImage(thumbnail=thumbnail)
image.put()

保存した画像を表示します。

return Response(image.thumbnail, mimetype='image/jpg')

全体のコードは次のようになります。

myapp/views.py

from google.appengine.ext import db
from google.appengine.api import images
from kay.utils import (forms, render_to_response)
from werkzeug import Response

class ThumbnailImage(db.Model):
thumbnail = db.BlobProperty()

class UploadForm(forms.Form):
upload_file = forms.FileField(u'画像ファイル', required=True)

def index(request):
form = UploadForm()
if request.method == 'POST' and form.validate(request.form, request.files):
#画像をリサイズして保存
uploaded_image = images.Image(form['upload_file'])
uploaded_image.resize(width=100) #幅
thumbnail = uploaded_image.execute_transforms(output_encoding=images.JPEG)
image = ThumbnailImage(thumbnail=thumbnail)
image.put()
#保存した画像を表示
return Response(image.thumbnail, mimetype='image/jpg')

return render_to_response("myapp/index.html",
{'form': form.as_widget()})

myapp/templates/index.html

{{ form() | safe }}

補足

blobstoreを使う方法は「Kay でも blobstore を使う (サムネイルも)」が参考になります。