Сбой HTTPS при использовании модуля «запросы» в Google App Engine

1

Я хочу использовать модуль 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?

  • 2
    Используете ли вы среду Flex с Python 3? Эти библиотеки встроены в стандартную среду, но не в среду Flex. Итак, вам нужно будет добавить его в свой проект, как вы сказали во второй попытке. Как выглядит ваше дерево каталогов?
Теги:
python-3.x
google-app-engine
python-3.6
python-module

1 ответ

4

Это было больно для настройки для 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню