升级到最新的SDK 1.9.17后,当我在dev_appengine.py
本地运行项目时,我开始出现此错误
INFO 2014-12-10 09:48:33,364 myapp.py:796] Url: http://saas.examples.com/documents, payload: {'filename': u'testlink.doc', 'key': u'p1UuXhzhS4qjj2KXmFre'}
WARNING 2014-12-10 09:48:34,089 urlfetch_stub.py:451] Received a 301 to a POST. Redirecting with a GET
WARNING 2014-12-10 09:48:34,791 myapp.py:809] failed. Code: 405, error: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>
我的代码很简单。
result = urlfetch.fetch(
url=url,
payload=json.dumps(payload),
method=urlfetch.POST,
headers={'Content-Type': 'application/json'})
if result.status_code == utils.OK:
json_result = json.loads(result.content)
else:
logging.warn(
'failed. Code: %s, error: %s',
result.status_code, result.content)
在恢复到以前版本的SDK(1.9.15)后,异常会再次消失。
我的问题:
1)这是GAE错误吗?如果是这样,向GAE团队报告的正确方法是什么?
2)如果它不是GAE SDK问题,我该如何修复我的代码?
答案 0 :(得分:2)
对URLFetch如何处理更新的SDK中的重定向进行了更改。
长话短说,基本上,无论原始方法是什么,所有重定向都成为GET方法。因此,如果您执行POST URLFetch,然后重定向将把它变成GET。
有两种方法可以修复您的代码:
1)对包含重定向的所有URLFetch使用GET方法
2)不要使用重定向并直接定位最终网址
但是,从您的错误来看,目标网址似乎不接受GET请求?如果是这样的话,直接对它进行POST。
有关URLFetch的详细信息,请参阅此链接 - https://cloud.google.com/appengine/docs/python/urlfetch/#Python_Fetching_URLs_in_Python
有关SDK版本的详细信息,请参阅此链接 - https://code.google.com/p/googleappengine/wiki/SdkReleaseNotes#Version_1.9.14_-_October_21,_2014