GAEにアクセスするPythonスクリプトで405エラー(Method Not Allowed)

GAEにアクセスするPythonスクリプトで405エラー(Method Not Allowed)


 GAEで適当なサンプルをコピーして画像アップローダを作り、ローカルのPythonからファイルを自動アップロードしようとした際、405 Method Not Allowedというエラーが出てきた。

Traceback (most recent call last):

  File "C:\Program Files\Smith Micro\Poser Pro 2010\Runtime\Python\poserscripts\pose360\upload.py", line 30, in ?

    print urllib2.urlopen(req).read()

  File "./Runtime\Python\Lib\urllib2.py", line 130, in urlopen

    return _opener.open(url, data)

  File "./Runtime\Python\Lib\urllib2.py", line 364, in open

    response = meth(req, response)

  File "./Runtime\Python\Lib\urllib2.py", line 471, in http_response

    response = self.parent.error(

  File "./Runtime\Python\Lib\urllib2.py", line 402, in error

    return self._call_chain(*args)

  File "./Runtime\Python\Lib\urllib2.py", line 337, in _call_chain

    result = func(*args)

  File "./Runtime\Python\Lib\urllib2.py", line 480, in http_error_default

    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)

urllib2.HTTPError: HTTP Error 405: Method Not Allowed

 ローカルのPythonは、GAEのURL(http://xxx.appspot.com/ ←仮のURL)に対して、画像をPostするというもの。レンタルサーバ上にテスト用に設置した掲示板には問題なくアップロードできた。
 また、GAEに設置した画像掲示板にはブラウザ経由だと、正しく画像がアップロードできた。


原因


 urllib2.urlopen(req).read()で指定URLにPostしたのだが、http://xxx.appspot.com に対してPostしたのがまずかった。
 正しくは、http://xxx.appspot.com/uploadにすべきだったのだ。
 ダッシュボードのLogsで、ブラウザから正常アップロードできていたときのログを見て気がついた。
 
 

▲アップロード時は/uploadにアクセスしている!?


対処方法


 すでに書いたけども、URLを http://xxx.appspot.com/upload にすれば動いた。
 単純なことなんだけども、これがわかるまでに丸一日かかって悔しすぎるので、せめてこの場所に記録しておくことにしよう。