Django Hack-a-thon Disc.8 に参加してきた

移転しました。

Django Hack-a-thon Disc.8 に参加してきた。

ハンズオン C(Google App Engine)

ハンズオン C(Google App Engine)に参加。GAE/Jは触っていたけど、なぜかGAEの方はさわっていなかったのでこの際に覚えてしまおうという心意気。
このPDF資料】を見ながら進める

早速はまったので、いくつかメモっておく。

準備
  • SDKバージョンアップ。自分がインスコしていたGAE SDKが1.0で古かったので1.2.1 にバージョンアップ

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&timestamp=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/