GAEpでiPhone向けWebアプリを作る (4)GAEpプロジェクトとそのファイル構成

前回の続きです。

GAEpプロジェクトとそのファイル構成

Google App Engine Pythonプロジェクトの作成

プロジェクト作成方法は、スタートガイドあたりを参考に適当に。ここでは割愛。

プロジェクト内のファイル構成

以下のようなファイル構成にしました。

<project dir>/
+--app.yaml
+--index.yaml
+--cron.yaml
+--main.py
+--todo/
   +--__init__.py
   +--handlers.py       # RequestHandlerクラス群
   +--models.py         # DataStoreクラス群
   +--tasks.py          # cronタスククラス群
   |
   +--staticdir/        # 静的ファイル格納
   |  +--views.html     # メインビュー
   |  +--bye.html
   |  +--todo.manifest  # 現在未使用
   |  +--css/           # css格納
   |  |  +--iphone.css
   |  |  +--todo.css
   |  +--js/            # javascript格納
   |  |  +--jquery-1.4.4.min.js
   |  |  +--default.js
   |  +--img/           # 画像リソース格納
   |     +--button.png
   |     +--back_button.png
   |
   +--templates/        # テンプレートファイル格納
      +--views.tpl@

今回作ってみて、この構成に対して以下の感想を持っています。

  • 静的ファイルstaticdir/とテンプレートファイルtemplates/は明確に分けるべき
  • staticdir/を設けることでpythonスクリプトと静的ファイルを明確に分離できる
  • staticdir/内には実際のサービス時と同一の相対パスで html/css/javascript を配置
  • staticdir/の中で html/css/javascriptデバッグがしやすい
  • 本当は、静的ファイル群(staticdir/)とスクリプト(*.pyやテンプレートファイル群)は同一のディレクトリ階層に配置するのはあまりよくないかもしれない。が、近いほうが安心するので今回はこのようにした

なお、特に静的ファイルとテンプレートファイルの混同には、充分注意すべきです。同一パスのファイルを静的ファイルとしてもテンプレートファイルとしても利用するのは GAEp 上禁止されています。GAEp アプリは、サーバにアップロードされる際、静的ファイルは StaticFileServer に、テンプレートファイルは ApplicationServer にアップロードされるようです。つまりアップロード先が異なります。
どうしても静的ファイルとテンプレートファイルを同一にしたい場合には、シンボリックリンクを作成します。例えば、上記のファイル構成図で、templates/views.tpl ファイルは、staticdir/views.html ファイルのシンボリックリンクにしてあります。このようにしておくと開発機上では実体ファイルをひとつにしつつ、アップロード時に両方のサーバにアップロードされます。

app.yamlの記述 (ユーザ認証なし)

app.yaml の内容を下に示します。ただし、この段階ではまだユーザ認証は設定していません。

app.yaml

application: penguinwatcher
version: 1
runtime: python
api_version: 1

builtins:
- remote_api: on


handlers:

- url: /todo/js
  static_dir: todo/staticdir/js

- url: /todo/css
  static_dir: todo/staticdir/css

- url: /todo/img
  static_dir: todo/staticdir/img

- url: /todo/(.*\.html)
  static_files: todo/staticdir/\1
  upload: todo/staticdir/(.*\.html)

- url: /todo/tasks/.*
  script: main.py
  login: admin

- url: /todo/.*
  script: main.py

js/, css/, img/, *.htmlは、todo/直下のパスにマッピングすることにします。
つまり、

(URL)  http://penguinwatcher.appspot.com/todo/views.html
↓
(ファイルパス) ./todo/staticdir/views.html

また、同様に、todo/直下のパスに リクエストハンドラをマッピングします。


本日はここまで。次回はモデル(models.py)およびリクエストハンドラ(handlers.py)を書いていきます。

参考

Google App Engine については、基本的に Google が公開しているデベロッパーガイドを見ればだいたいのことはわかります。内容もわかりやすいです。

特に、Google App Engine Python については、以下です。

基本的にはこれらのサイトを見ればほとんどのことはわかりますが、その他に僕は以下の本を参考にしています。

Programming Google App Engine

Programming Google App Engine

和訳も出ているようです。

プログラミング Google App Engine

プログラミング Google App Engine