Я хочу использовать модуль requests
в стандартной среде выполнения Python Google App Engine.
Цитата из официальных документов Google Cloud:
Вы можете использовать сторонние библиотеки, которые являются чистым кодом Python без расширений C, скопировав библиотеку в каталог вашего приложения. Если сторонняя библиотека уже встроена, в комплекте со средой выполнения, вы можете использовать библиотеку, не копируя ее в свое приложение.
Сторонние библиотеки должны быть реализованы как чистый код Python без расширений C. Если они скопированы в ваш каталог приложений, они учитывают квоты на файлы, потому что библиотека загружается в App Engine вместе с вашим кодом приложения.
requests
не связаны с GAE, поэтому я добавил его в папку приложения в соответствии с инструкциями.
requests
требуется несколько других модулей, которые не поставляются с GAE, поэтому я добавил их все в папку приложения:
certifi
chardet
idna
urllib3
Возникла еще одна проблема. Мой запрос обращается к API-интерфейсу стека, который имеет протокол https://
. Здесь ошибка:
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, но я не мог найти его нигде!
Как правильно использовать модуль requests
в Google App Engine?
Это было больно для настройки для python 2.7 в стандарте GAE. Это связано с бета-версией бета-версии приложения для их версии библиотеки ssl python и несколькими другими факторами и целями.
Я уверен, что вы столкнетесь с некоторыми отличиями для python3. Это были ключевые бит для меня, чтобы заставить его работать:
запросы 2.18.2
request_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"
FUTHERMORE, это заставило меня работать на меня в производстве, но не на моем локальном хосте. В дополнение к локальному каталогу 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: Нет модуля с именем _ssl" с dev_appserver.py из Google App Engine