Google App Engine 上的 python 请求不适用于 HTTPS

Posted

技术标签:

【中文标题】Google App Engine 上的 python 请求不适用于 HTTPS【英文标题】:python requests on Google App Engine not working for HTTPS 【发布时间】:2014-03-03 12:59:41 【问题描述】:

我在 Google App Engine 上使用 python-request,但它在 HTTPS 上没有按预期工作。我们来看一个例子:

import requests
requests.get('https://www.digitalocean.com')

如果我在终端中执行该行,它会完美运行。响应为 200 OK(无重定向)。

但是,如果我在 GAE 上执行它,则会引发 TooManyRedirects 错误。 试图弄清楚我使用allow_redirects = False执行的问题是什么,我可以看到响应是指向相同url的重定向(301)!!! ('location' 标头值为 'https://www.digitalocean.com')。这显然(当 allow_redirect=True 时)反复发生,直到引发 TooManyRedirects 错误。

因此,python-requests 似乎不适用于 HTTPS 的 GAE(我已经使用多个 URL 进行了测试)。但是 HTTP 完美运行。

知道发生了什么吗?

提前致谢。

【问题讨论】:

我也有这个问题。 如果有帮助,我最近升级到 urllib3==1.71 和 requests==2.2.1 在此处提交了 AppEngine 问题:code.google.com/p/googleappengine/issues/detail?id=10562 我在 python-requests repo 中做了同样的事情:github.com/kennethreitz/requests/issues/1905 Using the Requests python library in Google App Engine的可能重复 【参考方案1】:

降级到 requests==2.1.0 对我有用。

拥有最新的 urllib3 对于解决不相关的错误(import pwd,我记得)很重要。

希望 App Engine 尽快解决此问题,请求 won't。

编辑:

我认为您也可以通过评论 lines 161-175 in sessions.py 在最新请求中修补此问题。未经测试。

【讨论】:

如何降级到较早版本的请求? 到目前为止,这似乎是让它工作的唯一方法......所以当我们等待 GAE 中的修复时,这是一个非常有效的响应。谢谢鼠尾草!干得好! 嗨@rattay。问题似乎只是连接到 Google IP 地址(例如 Google oAuth),因为它们被套接字 API 阻止,如下所示:cloud.google.com/appengine/docs/python/sockets 在这种情况下,您的补丁似乎不再起作用。在最新版本的请求(2.8.1)中,评论我们的 session.SessionRedirectMixin.rebuild_auth 并不能解决错误:无法建立新连接:[Errno 13] Permission denied @jacob 你尝试降级到 requests==2.1.0 吗? 在此确认 2.1.0 和 2.3.0 可以在最新的gcloud 104 -- app-engine-python 1.9.35上工作【参考方案2】:

现在有比更改requests 版本更好的解决方案。正如official docs 中所建议的,您可以使用猴子补丁requests 与Google App Engine 很好地配合。

首先install requests-toolbelt:

pip install -t lib requests-toolbelt

然后在您的main.py 文件(或等效文件)中:

import requests_toolbelt.adapters.appengine

requests_toolbelt.adapters.appengine.monkeypatch()

【讨论】:

以上是关于Google App Engine 上的 python 请求不适用于 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 上的 Production App 突然无法访问 Google Cloud Storage

Google Apps 域上的 Google App Engine

Google App Engine 上的 web.py

部署失败:Google App Engine 上的 Kotlin Spring Boot 应用

Google App Engine 上的 Django TemplateDoesNotExist

OSX 上的 Google App Engine SDK 路径在哪里?