urlfetch_stub.py:收到301到POST。使用GET重定向

时间:2014-12-10 19:00:29

标签: python google-app-engine redirect google-cloud-platform google-cloud-python

升级到最新的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问题,我该如何修复我的代码?

1 个答案:

答案 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