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

    (precompileでGoogle App Engineのspin upが約2.5倍速くなる | 山本隆の開発日誌)

  • タスクキューストレージの上限を設定できるようになりました。

    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が拡張されました。

  • remote_api_shellコマンドがHTTPSやHTTPで送信できるようになりました。

  • 管理コンソールのログにリクエスト時間の遅延の情報が含まれるようになりました。

  • 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がメンテナンスモードかどうかを調べる

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関連のメモ

Google App Engineで静的ファイルのキャッシュ期間を設定する

Google App Engineで静的ファイルのキャッシュ期間を設定する | 山本隆の開発日誌」より。

Google App Engineで静的ファイルのキャッシュ期間を設定する方法。

app.yamlのdefault_expirationで、静的ファイルのキャッシュ期間を設定することができます。

app.yaml

application: myapp
version: 1
runtime: python
api_version: 1

default_expiration: "4d 5h"

handlers:
# ...

変更されることのない静的ファイルは、キャッシュ期間を長く設定することでHTTPリクエストを減らして、表示速度を上げることができますね。