アップデート
App Engine SDK 1.9.24は 2015 年 7 月 20 日にリリースされました。この問題がまだ発生している場合は、更新するだけで問題を解決できるはずです。正確な問題と解決策の説明については、以下の +jpatokal の回答を参照してください。
元の質問
使用しているアプリケーションがあり、ローカルで開発しているときに問題が発生しています。
を使用してアプリの認証サーバーをチェックする共有コードがいくつかありますurllib2.urlopen
。ローカルで開発すると、AppEngine からのリクエストを行うアプリで 404 で拒否されますが、端末からのリクエストは問題なく成功します。
ポートで appengine を実行しlocalhost:8000
、認証サーバーをlocalhost:8001
import urllib2
url = "http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE="
try:
r = urllib2.urlopen(url)
print(r.geturl())
print(r.read())
except urllib2.HTTPError as e:
print("got error: {} - {}".format(e.code, e.reason))
これgot error: 404 - Not Found
は AppEngine 内から発生します
AppEngine が、ヒットしようとしている URL の PATH 部分にスキーマ、ホスト、およびポートを追加しているようです。これは、認証サーバーに表示されるものです。
[02/Jul/2015 16:54:16] "GET http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE= HTTP/1.1" 404 10146
リクエストヘッダーから、スキーム全体とホストとポートがパスの一部として渡されていることがわかります(以下のヘッダー部分)。
'HTTP_HOST': 'localhost:8001',
'PATH_INFO': u'http://localhost:8001/api/CheckAuthentication/',
'SERVER_PORT': '8001',
'SERVER_PROTOCOL': 'HTTP/1.1',
AppEngine Dev サーバーがこの要求を別のポートの localhost にハイジャックしないようにする方法はありますか? それとも、何が起こっているのか誤解していませんか?ドメインが異なる本番環境では、すべてが正常に機能します。
私を正しい方向に向けるのに役立つ支援を前もって感謝します。