Google App Engine SDK 1.3.5リリース
「Google App Engine SDK 1.3.5リリース | 山本隆の開発日誌」より。
Google App Engine SDK 1.3.5がリリースされました。
リリースノートより。
pre-compilationが可能になりました。起動時間が短縮できます。
方法は、app.yamlのderived_file_typeに- python_precompiledを指定します。app.yaml
derived_file_type:
- python_precompiled
タスクキューストレージの上限を設定できるようになりました。
queue.yamlのtotal_storage_limitで指定します。
(Python Task Queue Configuration – Google App Engine – Google Code)タスクキューの上限が1アプリあたり50qpsから1キューあたり50qpsになりました。
Blobをファイルのように扱うことができるBlobReaderクラスが導入されました。
from google.appengine.ext.blobstore import blobstore
blob_key = …
reader = blobstore.BlobReader(blob_key)
bytes = reader.read()Bulkloaderが拡張されました。
管理コンソールのログにリクエスト時間の遅延の情報が含まれるようになりました。
Db.deleteがモデルやキーのリストに加えてiterableも受け付けるようになりました。
データストアがend cursorsをサポートしました。
終了地点のカーソルを指定できるようになりました。
q = Person.all()
# cursor1からcursor2までを取得
q.with_cursor(cursor1, cursor2)(Google App Engine 1.3.5で導入されたQueryのEnd Cursorsを使ってみる。 | 山本隆の開発日誌)
動作は未確認です。
間違いがあればご指摘ください。
Jinja2 でループのインデックスを取得する
「Jinja2 でループのインデックスを取得する | 山本隆の開発日誌」より。
Gogole App Engine用フレームワーク Kay のテンプレートエンジンに使用されている Jinja2 でループのインデックスを取得する方法。
enumerate()みたいなことをJinja2でしたい。
for index, item in enumerate(items):
print '%d %s' % (index, item)
Jinja2にはループの中で使用できる「loop」という特別な変数が用意されている。
「loop.index0」を使用すると、ループのインデックスを取得することができる。
<table>
{% for item in items %}
<tr>
<td>{{ loop.index0 }}</td>
<td>{{ item }}</td>
</tr>{% endfor %}
</table>
「loop.index」は、ループのインデックスが1から始まる。
<table>
{% for item in items %}
<tr>
<td>{{ loop.index }}</td> <td>{{ item }}</td>
</tr>
{% endfor %}
</table>
Google App Engine/Python関連のメモ
Kay Framework に RESTful な API を実装するための機能が追加されていた
http://d.hatena.ne.jp/griefworker/20100618/restviewgroup
Google App Engineがメンテナンスモードかどうかを調べる
「Google App Engineがメンテナンスモードかどうかを調べる | 山本隆の開発日誌」より。
Google App Engineがメンテナンスモードかどうかを調べるには、google.appengine.api.capabilities.CapabilitySetを使用します。
from google.appengine.api import capabilities
enabled = capabilities.CapabilitySet(package, capabilities=None, methods=None, stub_map=apiproxy_stub_map).is_enabled()
Images APIが使用できるか
capabilities.CapabilitySet('images').is_enabled()
データストアに書き込みできるか
capabilities.CapabilitySet('datastore_v3', capabilities=['write']).is_enabled()
Memcacheの読み込みができるか
capabilities.CapabilitySet('memcache', methods=['get']).is_enabled()
メンテナンスの予定の有無を調べるにはCapabilitySet.will_remain_enabled_for()を使用します。
from google.appengine.api import capabilities
enabled = capabilities.CapabilitySet(package, capabilities=None, methods=None, stub_map=apiproxy_stub_map).will_remain_enabled_for(time=60)
60秒以内にImages APIのメンテナンスが予定されているか
capabilities.CapabilitySet('images').will_remain_enabled_for(60)
参考
Google App Engine用フレームワーク Kay のテスト環境でImagesサービスとCapabilitiesサービスを有効にする。
「Google App Engine用フレームワーク Kay のテスト環境でImagesサービスとCapabilitiesサービスを有効にする。 | 山本隆の開発日誌」より。
Google App Engine用フレームワーク Kay でGAETestBaseを使いテストをしていると、ImagesサービスとCapabilitiesサービスが使用できないことに気づいた。
kay/ext/testutils/gae_test_base.py に次の行を追加することで使用できるようになった。
kay/ext/testutils/gae_test_base.py 44行目に追加
from google.appengine.api.images import images_stub
from google.appengine.api.capabilities import capability_stub
kay/ext/testutils/gae_test_base.py 94行目に追加
_apiproxy.RegisterStub('images', images_stub.ImagesServiceStub())
_apiproxy.RegisterStub('capability_service', capability_stub.CapabilityServiceStub())
Google App Engine/Python関連のメモ
- Kay Framework で Model を JSON に変換する方法
http://d.hatena.ne.jp/griefworker/20100607/kay_framework_model_json
- appengine- mapreduceを使ってみた。
http://d.hatena.ne.jp/Jxck/20100605/1275752466
- GAE のデータストアに、PyCryptoの暗号化した文字列を登録、呼び出してみた
http://d.hatena.ne.jp/sippu/20100604/1275659513
Google App Engineで静的ファイルのキャッシュ期間を設定する
「Google App Engineで静的ファイルのキャッシュ期間を設定する | 山本隆の開発日誌」より。
Google App Engineで静的ファイルのキャッシュ期間を設定する方法。
app.yamlのdefault_expirationで、静的ファイルのキャッシュ期間を設定することができます。
app.yaml
application: myapp
version: 1
runtime: python
api_version: 1default_expiration: "4d 5h"
handlers:
# ...
変更されることのない静的ファイルは、キャッシュ期間を長く設定することでHTTPリクエストを減らして、表示速度を上げることができますね。