Django Hack-a-thon Disc.8 に参加してきた
移転しました。
Django Hack-a-thon Disc.8 に参加してきた。
ハンズオン C(Google App Engine)
ハンズオン C(Google App Engine)に参加。GAE/Jは触っていたけど、なぜかGAEの方はさわっていなかったのでこの際に覚えてしまおうという心意気。
【このPDF資料】を見ながら進める
早速はまったので、いくつかメモっておく。
準備
PDFに従って進めていく
$ cp -r app-engine-patch-sample handson $ cd handson $ python manage.py runserver
しかし、ここで以下エラーが発生
$ python manage.py runserver /Library/Python/2.5/site-packages/pygoogle/google.py:58: DeprecationWarning: SOAPpy not imported. Trying legacy SOAP.py. import GoogleSOAPFacade Traceback (most recent call last): File "manage.py", line 4, in <module> setup_env(manage_py_env=True) File "/Users/matsukazetakashi/src/app-engine-patch-sample/common/appenginepatch/aecmd.py", line 55, in setup_env from google.appengine.api import apiproxy_stub_map ImportError: No module named appengine.api
id:ianと原因を調べていくと
$ python Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> >>> import google /Library/Python/2.5/site-packages/pygoogle/google.py:58: DeprecationWarning: SOAPpy not imported. Trying legacy SOAP.py. import GoogleSOAPFacade >>> >>> google <module 'google' from '/Library/Python/2.5/site-packages/pygoogle/google.pyc'>
おや?pygoogleを見ているorz
そういえば、この前インストールしたんだった。。。このため、pygoogleを消して動かしてみると
$ python manage.py runserver WARNING:root:Could not read datastore data from /var/folders/y1/y1qhWwX5EI0h3vvny7HNwU+++TI/-Tmp-/django_aep-sample.datastore WARNING:root:Could not read datastore data from /var/folders/y1/y1qhWwX5EI0h3vvny7HNwU+++TI/-Tmp-/django_aep-sample.datastore.history Running on app-engine-patch 1.0 INFO:google.appengine.tools.appengine_rpc:Server: appengine.google.com Allow dev_appserver to check for updates on startup? (Y/n): Y dev_appserver will check for updates on startup. To change this setting, edit /Users/matsukazetakashi/.appcfg_nag INFO:root:Checking for updates to the SDK. DEBUG:google.appengine.tools.appengine_rpc:Sending HTTP request: POST /api/updatecheck?release=1.2.1×tamp=1238791978&api_versions=%5B%271%27%5D HTTP/1.1 Host: appengine.google.com X-appcfg-api-version: 1 Content-type: application/octet-stream User-agent: appcfg_py/1.2.1 Darwin/9.6.0 Python/2.5.1.final.0 INFO:root:The SDK is up to date. WARNING:root:Could not read datastore data from /var/folders/y1/y1qhWwX5EI0h3vvny7HNwU+++TI/-Tmp-/django_aep-sample.datastore WARNING:root:Could not read datastore data from /var/folders/y1/y1qhWwX5EI0h3vvny7HNwU+++TI/-Tmp-/django_aep-sample.datastore.history INFO:root:Running application aep-sample on port 8000: http://localhost:8000
おぉ〜、やっと動いた!
サンプルアプリ作成
PDF通りに進めていったが、ほぼ問題なく動いた。
ただ、以下の部分などの修正がはいった。
polls/views.py --------------- from polls.models import Poll def index(request): latest_poll_list = Poll.all().order('-pub_date').fetch(5) output = ', '.join([p.question for p in latest_poll_list]) return HttpResponse(output) def detail(request, poll_id): pass def vote(request, poll_id): pass
本番アップ
python manage.py update を行い、GAEにアップロードする
$ cd handson $ python manage.py update Running on app-engine-patch 1.0 Scanning files on local disk. Scanned 500 files. Initiating update. Cloning 69 static files. Cloning 454 application files. Cloned 100 files. Cloned 200 files. Cloned 300 files. Cloned 400 files. Deploying new version. Checking if new version is ready to serve. Will check again in 1 seconds. Checking if new version is ready to serve. Closing update: new version is ready to start serving. Uploading index definitions.
以下のようなエラーが発生した。このエラーは出たり出なかったりするようだ。
10分後くらいに再度アクセスしたら問題なく、実行できたりもした。原因がよくわからないorz
<class 'google.appengine.ext.db.DuplicatePropertyError'>: Class User already has property message_set Traceback (most recent call last): File "/base/data/home/apps/gae-sample/1.333031378130420000/common/appenginepatch/main.py", line 67, in <module> main() File "/base/data/home/apps/gae-sample/1.333031378130420000/common/appenginepatch/main.py", line 26, in real_main util.run_wsgi_app(application) File "/base/python_lib/versions/1/google/appengine/ext/webapp/util.py", line 76, in run_wsgi_app result = application(env, _start_response) File "/base/data/home/apps/gae-sample/1.333031378130420000/common/zip-packages/django-1.0.2.zip/django/core/handlers/wsgi.py", line 239, in __call__ File "/base/data/home/apps/gae-sample/1.333031378130420000/common/zip-packages/django-1.0.2.zip/django/core/handlers/base.py", line 67, in get_response File "/base/python_dist/lib/python2.5/locale.py", line 17, in process_request # : :
また、サンプルアプリでいうと投票機能で投票ができなかったので、
GAEのLogsをみていると以下がInfoで出力されていた。こいつが原因みたい。
no matching index found. This query needs this index: - kind: polls_choice properties: - name: __key__ - name: poll
どうもGAEのバグっぽい。index.yamlが自動で更新されていないため、アプリがうまく動かないようだ。
このため、以下のように修正後、再度アップデート。
$ vi /handson/index.yaml ----- # AUTOGENERATED ← こいつをファイルの先頭にもってくる。削除してもよいかもしれない : : # 以下を追加 - kind: polls_choice properties: - name: __key__ - name: poll : : -----
ちゃんと動くようになった!
http://gae-sample.appspot.com/polls/