我想在Google App Engine Python标准运行时环境中使用requests
模块。
通过将库复制到应用程序目录中,可以使用无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
模块?
答案 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