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