2011年9月9日金曜日

Ubuntu10.04でGAE on Python

GAE on Python を Python の勉強がてらやってみようかと。
で、イロイロ踊らされてしまった内容をツラツラと書こうかと。

まず、前提条件としてGAEはPython2.5でないとイカンという有名な話がある。
Ubuntu10.04はPython2.6が標準インストールされている。
根が横着なので、Python2.6でGAEを動かそうと考えた訳で。
結論から言うとちゃんと動きました。App Engine SDK に手を加えることなく動きます。

何が問題だったかと言うと、まず、単純にSDKの最新版をダウンロードして適当なフォルダに解凍した。んでチュートリアルに従ってプロジェクトを作成し実行したら、下記エラーが発生した。

Warning: You are using a Python runtime (2.6) that is more recent than the production runtime environment (2.5). Your application may use features that are not available in the production environment and may not work correctly when deployed to production.
INFO     2011-09-09 08:40:30,324 appengine_rpc.py:159] Server: appengine.google.com
WARNING  2011-09-09 08:40:30,330 datastore_file_stub.py:512] Could not read datastore data from /tmp/dev_appserver.datastore
INFO     2011-09-09 08:40:30,333 rdbms_sqlite.py:58] Connecting to SQLite database '' with file '/tmp/dev_appserver.rdbms'
Traceback (most recent call last):
  File "google_appengine/dev_appserver.py", line 77, in 
    run_file(__file__, globals())
  File "google_appengine/dev_appserver.py", line 73, in run_file
    execfile(script_path, globals_)
  File "/app_path/google_appengine/google/appengine/tools/dev_appserver_main.py", line 689, in 
    sys.exit(main(sys.argv))
  File "/app_path/google_appengine/google/appengine/tools/dev_appserver_main.py", line 653, in main
    default_partition=default_partition)
  File "/app_path/google_appengine/google/appengine/tools/dev_appserver.py", line 4971, in CreateServer
    server = HTTPServerWithScheduler((serve_address, port), handler_class)
  File "/app_path/google_appengine/google/appengine/tools/dev_appserver.py", line 4999, in __init__
    request_handler_class)
  File "/usr/lib/python2.6/SocketServer.py", line 400, in __init__
    self.server_bind()
  File "/usr/lib/python2.6/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/usr/lib/python2.6/SocketServer.py", line 411, in server_bind
    self.socket.bind(self.server_address)
  File "", line 1, in bind
socket.error: [Errno 98] Address already in use

ここでちゃんとエラーを読んでググってればここで終わったのにちゃんと読まなかったため
ぁぁ、やっぱりPython2.5が要るんだなと判断しちゃって、瞑想しちゃいました。
ちなみに、このエラーはAddress already in useと出てて、アドレス使ってますよと言っています。
Tomcatをインストールしていて、それが自動起動しちゃってたため、ポート8080がかぶって起動しなかったのです。
それをPython2.5入れて、環境汚さないようにvirtualenv入れてとかイロイロやったけど、起動するときに
google_appengine/dev_appserver.py -p 8081 /app_path
で、起動しちゃいました。 なんか、どっと疲れた。 これから、ちょっとずつPythonやってなんかサイト作ります。