Google App Engineのapp.yamlのupload

http://code.google.com/appengine/docs/configuringanapp.html
こちらの"Static File Pattern Handlers"に出てくる、uploadパラメータの意味がよくわからんかったので、調べてみました。

結論から言うと、こんな感じ。
・ローカルで使う分には意味ない。無茶苦茶な文字列を入れても動いてしまう。GAEサーバにアップロードするときにはじめて意味を持つ。
・uploadに指定された正規表現に一致するファイルが、GAEサーバにアップロードされる。
・urlとuploadには関連はなくて、どこのハンドラでuploadをしてしても良さそう(な気がする)。

以下、実験。

matsuza@karma ~/google_appengine/upload_test
$ ls
1.txt*  2.txt*  app.yaml*

matsuza@karma ~/google_appengine/upload_test
$ cat 1.txt
1

matsuza@karma ~/google_appengine/upload_test
$ cat app.yaml
application: XXXXXXXXXXXXXXXX
version: 1
runtime: python
api_version: 1

handlers:
- url: /1.txt
  static_files: 1.txt
  upload: AAAAAAAAAAAAA

matsuza@karma ~/google_appengine/upload_test
$ ../dev_appserver.py .  &

→uploadに不適切な文字列を入れているが、開発用サーバはエラー無しで起動する。

matsuza@karma ~/google_appengine/upload_test
$ wget -q -O - http://localhost:8080/1.txt
INFO     2008-04-13 18:21:31,776 __init__.py] "GET /1.txt HTTP/1.0" 200 -
1

→開発用サーバにアクセスしてみたら、1.txtが表示できちゃう。uploadは開発用サーバでは無意味ぽい。

matsuza@karma ~/google_appengine/upload_test
$ ../appcfg.py update .
Loaded authentication cookies from /home/matsuza/.appcfg_cookies
Scanning files on local disk.
Initiating update.
Cloning 4 application files.
Uploading 1 files.
Closing update.
Uploading index definitions.

→uploadが不適切なまま本番サーバへアップロード。うまくいく。

matsuza@karma ~/google_appengine/upload_test
$ wget -O - http://XXXXXXXXXXXX.appspot.com/1.txt
--18:23:50--  http://XXXXXXXXX.appspot.com/1.txt
           => `-'
Resolving XXXXXXXXXXX.appspot.com... 209.85.139.118
Connecting to XXXXXXXX.appspot.com|209.85.139.118|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
18:23:50 ERROR 404: Not Found.

→本番サーバにアクセスすると、404になる。今度はapp.yamlを書き換えて、uploadを2.txtにする。1.txtにアクセスすると2.txtが表示される、なんてことにならないかな?

matsuza@karma ~/google_appengine/upload_test
$ cat app.yaml
application: XXXXXXXXXXX
version: 1
runtime: python
api_version: 1

handlers:
- url: /1.txt
  static_files: 1.txt
  upload: 2.txt

matsuza@karma ~/google_appengine/upload_test
$ ../appcfg.py update . ;  wget -O - http://XXXXXXXXXXXXXX.appspot.com/1.txt

Loaded authentication cookies from /home/matsuza/.appcfg_cookies
Scanning files on local disk.
Initiating update.
Cloning 1 static file.
Cloning 3 application files.
Closing update.
Uploading index definitions.
--18:29:29--  http://XXXXXXXXXXXXXX.appspot.com/1.txt
           => `-'
Resolving XXXXXXXXXXXXXX.appspot.com... 72.14.255.118
Connecting to XXXXXXXXXXXXXX.appspot.com|72.14.255.118|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
18:29:29 ERROR 404: Not Found.

→アップロードまでは成功するが、アクセスはできない。たぶん裏では2.txtがアップロードされているのだと思うんだけど。
次は、1.txtのuploadで2.txtを、2.txtのuploadで1.txtを指定してみる。

matsuza@karma ~/google_appengine/upload_test
$ cat app.yaml ; ../appcfg.py update .
application: XXXXXXXXXXXXXX
version: 1
runtime: python
api_version: 1

handlers:
- url: /1.txt
  static_files: 1.txt
  upload: 2.txt

- url: /2.txt
  static_files: 2.txt
  upload: 1.txt
Loaded authentication cookies from /home/matsuza/.appcfg_cookies
Scanning files on local disk.
Initiating update.
Cloning 2 static files.
Cloning 1 application file.
Closing update.
Uploading index definitions.

matsuza@karma ~/google_appengine/upload_test
$ wget -q -O - http://XXXXXXXXXXXXXX.appspot.com/1.txt ; wget -q -O - http:/
/XXXXXXXXXXXXXX.appspot.com/2.txt
1
2

uploadで書くべきファイルが逆なのに、正しくアクセスできとるがな。

というわけで、upload属性は、単にローカルからサーバへアップロードされるファイルを記述するものなのではなかろうか、というように思う次第です。
ただ一個疑問が残るのが、こういう形でupload属性を作らなくても良かったんじゃない?ということ。
例えば、以下のようにupload属性が1つしかなくても良いような気がする。どうせurlとuploadは関連づけられていないんだし。

handlers:
- url: /1.txt
  static_files: 1.txt
- url: /2.txt
  static_files: 2.txt
- upload: [12]\.txt

こういう書式になっていないということは、僕の推測が間違ってるんじゃないかなーという状況証拠としても考えられますな。なんなんだろう。