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 にすれば動いた。
単純なことなんだけども、これがわかるまでに丸一日かかって悔しすぎるので、せめてこの場所に記録しておくことにしよう。