为什么在带有 GAE_USE_SOCKETS_HTTPLIB 的 AppEngine 中使用 Google API Python 客户端会导致 ResponseNotReady

Why does using the Google APIs Python client in appengine with GAE_USE_SOCKETS_HTTPLIB result in ResponseNotReady

代码在 SDK 中运行良好,但在 Google AppEngine 上,它会爆炸:

  File "./oauth2client/util.py", line 137, in positional_wrapper
  File "./googleapiclient/discovery.py", line 197, in build
  File "./oauth2client/util.py", line 137, in positional_wrapper
  File "./oauth2client/client.py", line 563, in new_request
  File "./httplib2/__init__.py", line 1608, in request
  File "./httplib2/__init__.py", line 1350, in _request
  File "./httplib2/__init__.py", line 1306, in _conn_request
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/python_std_lib/httplib.py", line 1033, in getresponse
    raise ResponseNotReady()
ResponseNotReady

这仅在 GAE_USE_SOCKETS_HTTPLIB 开启时发生。

发生这种情况是因为Google API库没有意识到这一点,盲目地使用套接字连接到https://www.googleapis.com,这是不允许的。此外,实际代码隐藏了真正的错误,即尝试创建套接字时权限被拒绝。

除了禁用 httplib 的套接字,或者不使用提供的库,而是使用基于请求的库并安装对这些域使用 urlfetch 的适配器之外,我不知道有任何解决方法。

套接字连接仅适用于付费应用。您是否已为您的应用设置结算?

来自documentation on sockets

套接字仅适用于付费应用,来自套接字的流量按传出带宽计费。

你为什么要尝试使用套接字?

除了@gcbirzan 的回答。以下是使其工作的步骤:-

  • 注释 GAE_USE_SOCKETS_HTTPLIB: True 如果它在 app.yaml 下设置 env_variables
  • 对于使用 pip install -t lib/ requests_toolbelt 安装 requests_toolbelt 的请求(确保你的请求版本 >= 2.10.0 才能正常工作)
  • main.py 中包含以下行以启用 requests_toolbelt 适配器
    import requests_toolbelt.adapters.appengine requests_toolbelt.adapters.appengine.monkeypatch()

以上步骤应该足以解决这个问题。