HTTPS在Google App Engine中使用“请求”模块失败

时间:2018-07-26 22:01:53

标签: python python-3.x google-app-engine python-3.6 python-module

我想在Google App Engine Python标准运行时环境中使用requests模块。

引用official Google Cloud docs

  

通过将库复制到应用程序目录中,可以使用无C扩展的纯Python代码的第三方库。如果第三方库已经内置,并且与运行时捆绑在一起,则可以使用该库而无需将其复制到您的应用中。

     

第三方库必须实现为无C扩展的纯Python代码。如果复制到您的应用程序目录中,它们将计入文件配额,因为该库与您的应用程序代码一起上传到App Engine。

requests没有与GAE捆绑在一起,因此我根据说明将其添加到了我的应用程序文件夹中。

requests需要GAE随附的其他一些模块,因此我将所有模块都添加到了我的应用程序文件夹中:

  • certifi
  • chardet
  • idna
  • urllib3

另一个问题出现了。我的请求转到具有https://协议的Stack Exchange API。这是错误:

SSLError: HTTPSConnectionPool(host='api.stackexchange.com', port=443): Max retries exceeded with url: /2.2/1?site=stackoverflow (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))

ssl模块内置在GAE Python运行时中,因此我在app.yaml中添加了以下内容:

libraries:
- name: webapp2
  version: latest

- name: ssl
  version: latest

它没有用。我遇到了和以前一样的错误。我将SSL模块文件夹复制到我的应用程序目录中,并在import ssl中进行了main.py,但是现在它抛出异常,要求安装另一个模块:

File "/Users/williamqin/Projects/stackpromo/ssl/__init__.py", line 61, in <module>
import _ssl2          # if we can't import it, let the error propagate
ImportError: No module named _ssl2

我在网上搜索了_ssl2 Python模块,但找不到它!

如何正确使用Google App Engine中的requests模块?

1 个答案:

答案 0 :(得分:4)

在GAE标准中为python 2.7进行设置非常麻烦。它涉及使用App Engine的python ssl库版本的beta版本以及其他一些零碎问题。

我确定您会在python3上遇到一些差异。这是让我正常运行的关键点:

请求2.18.2

requests_toolbelt 0.7.0

appengine_config.py

执行以下操作:

from requests_toolbelt.adapters import appengine as requests_toolbelt_appengine

# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt_appengine.monkeypatch()
app.yaml中的

具有以下内容:

env_variables:
  GAE_USE_SOCKETS_HTTPLIB : 'true'


libraries:
- name: ssl
  version: "2.7.11"
- name: pycrypto
  version: "2.6"

进一步,这使它在生产中对我有效,但不适用于我的本地主机。除了包含所有第三方库的本地lib目录之外,我还必须设置一个名为localhost_libs的附加目录,并在appengine_config.py中进行此操作:

vendor.add('lib')

if os.environ.get('SERVER_SOFTWARE', '').startswith('Development'):
    vendor.add('localhost_libs')

我有pycrypto的地方

而且,很长一段时间以来,每个人也必须这样做(最终dev_appserver中发生了一些更改,导致该功能无法正常工作):"ImportError: No module named _ssl" with dev_appserver.py from Google App Engine