主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python: GoogleAppEngineでのイメージなどのファイルデータの保存やサーブ

                
 ちょっと古い内容だが、GoogleAppEngineでのファイルデータの保存やサーブなどの方法について。現在のGoogleAppEngineはデータの保存場所がいくつかある状況になっていて、その中でBlobstoreを個人的にファイルデータの保存場所として選んだ経緯とその使いかたについて。

 ぼくがGoogleAppEngineに手を出したのは『10日でおぼえるPython入門教室』という、今からするとちょっと古い本によってだ。この本が出た頃は、GoogleAppEngineでユーザが選択できるデータの保存場所はDatastore一択だった。そこに容量の大きいデータの出し入れを可能にするBlobstoreが加わり、さらにBlobstoreと同等以上のメリットを持つとされるGoogleCloudStorageが加わった。
 『10日でおぼえるPython入門教室』ではイメージファイルのアップローダを作るのに際して、イメージファイルと、イメージファイルに付随するメタデータ(イメージのアップロード日時など)を一つのエンティティにまとめて保存していた。ぼくはこれを切り離したかった。ここでかつてのGoogleAppEngineなら、イメージデータもそのメタデータも保存先はDatastoreしか選べない。だけど今はそこにBlobstoreとGoogleCloudStorageが加わっていて、それらを選ぶメリットができている。
 BlobstoreはDatastoreのようなソートやフィルタリングのできるデータベースとはまったくと言えるほど別物だが、Datastoreの持つエンティティあたりの最大容量1MBを超える、32MBのファイルを保存できるようになっている。ほかにも大容量ファイルを扱う上ではBlobstoreのほうがメリットがある。だからイメージファイルはBlobstoreに保存したい。Datastoreにイメージのメタデータを保存してフィルタやソートをかけられるようにし、Blobstoreにイメージファイルのデータを保存して、メタデータのエンティティにBlobstoreに保存したイメージを呼ぶためのキーをプロパティとして持たせればいい。

 じゃあBlobstoreでなくてGoogleCloudStorageはどうかというと、こっちは無料割り当て分もなく使用に際して支払方法の選択が必要になるサービスだ。ぼくはGoogleAppEngineの無料で使える範囲でいろいろ試したりして遊んでいる。友達と共有できるものも作ったけど、金をとるサービスとして動かしているものはないので、無料の範囲を出て遊ぶつもりはまだない。というわけでGoogleCloudStorageはまだ使わずBlobstoreを使う。

 で、Blobstoreにファイルデータを書き込むのはどうやるかというと、リンク先も載せるけど以下のように。ちなみにこの"files"を使ったやり方は、GoogleがBlobstoreからGoogleCloudStorageの使用に移行して欲しいのか、そのうち消すよという注意が公式ドキュメントでされている。
import datetime

from google.appengine.api import files

Metadata(db.Model):
image_key = db.StringProperty()
uploader = db.StringProperty()
uploaded_date = db.DateTimeProperty()

class UploadHandler(webapp2.RequestHandler):
def post(self):
image_data = self.request.get("image_data")

# Create the file
file_name = files.blobstore.create(mime_type='image/jpeg')

# Open the file and write to it
with files.open(file_name, 'a') as f:
f.write(image_data)

# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)

# Get the file's blob key
blob_key = files.blobstore.get_blob_key(file_name)

# store metadata
md = Metadata()
md.image_key = blob_key
md.uploader = self.request.get("name")
md.uploaded_date = datetime.datetime.now()
md.put()

https://developers.google.com/appengine/docs/python/blobstore/#Python_Writing_files_to_the_Blobstore

 ファイルの書き込みに少し似た手順を実行することで、Blobstoreにデータが保存される。公式ドキュメントのサンプルではwith_statetmentをインポートしているが、Python2.7ですでにwithは組み込まれているので削除したところ難なく動いた。また"with files.open(file_name, 'a') as f"で書き込みのためファイルを開くという命令を出している。気になるのはopenメソッドの第二引数の'a'であるが、書き込みのために開くならこのAPIでは'a'と書くもので、'w'と書くのは不正解のようだ。またPythonでのファイルの読み書きに際してのopen()では、バイナリデータを扱うなら第二引数に'b'をつけたけどこれも不要。文字列だろうとバイナリだろうと'a'って入れとけばいい。

 Blobstoreにあるデータのサーブは以下のドキュメントに。
https://developers.google.com/appengine/docs/python/blobstore/#Python_Serving_a_blob
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。