Подтвердить что ты не робот

Может ли библиотека запросов Python использоваться в Google App Engine?

Можно ли использовать Requests в Google App Engine? Я думаю, что эта библиотека идеально подходит для создания клиента REST.

4b9b3361

Ответ 1

Да. В Google Appengine (версия 1.9.18) запросы версии 2.3.0 работают В ПРОДУКЦИИ (но не в SDK), если у вас включен биллинг, который включает поддержку сокетов.

Обновление: по состоянию на 31 января 2017 года Requests работает в производстве с версией 2.9.1 в производстве. Тем не менее, он не работает с Google Cloud SDK 141.0.0

запросы в Appengine SDK не выполняются со всеми запросами https://:

  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

Запрашивает версию 2.4.1 в производстве с:

  File "distlib/requests/adapters.py", line 407, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

Запросы версии 2.5.1 не выполняются с:

  File "distlib/requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

запросы версии 2.3.0 работают в производственном процессе, но могут вызвать проблемы с удаленной поддержкой Debian SSLv3 в SDK (запросы 2.3.0 поставляются с собственным устаревшим urllib3). В качестве обходного пути можно удалить строку, содержащую PROTOCOL_SSLv3, в источнике запроса urllib3 copy.

  'module' object has no attribute 'PROTOCOL_SSLv3'

Информация о поддержке сокетов: https://cloud.google.com/appengine/docs/python/sockets/

Ответ 2

Установите библиотеку requests-toolbelt: https://github.com/sigmavirus24/requests-toolbelt

Для App Engine это может быть что-то вроде: pip install requests-toolbelt -t lib

(Смотрите: https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27#installing_a_library)

Затем добавьте:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

В вашем main.py или эквивалентном.

Изменить. Это решение теперь является частью официальной документации: https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request (на вкладке REQUESTS)

Ответ 3

Пока не очень надеюсь. Поддержка GAE работает - см. Вопрос # 498 (исправления для App Engine).

В запросах используется urllib3, который, в свою очередь, использует httplib, который поддерживается на GAE в качестве обертки для API-интерфейса urlfetch. Хотя urllib3 использует некоторые модули, недоступные для GAE, это использование намеренно сделано необязательно, чтобы urllib3 можно было использовать в GAE.

Ответ 4

Теперь это возможно, я получил его, используя эту комбинацию обходных решений в appengine_config.py:

# Step 1: first add requests and requests-toolbelt to your requirements.txt (or however you install them via pip)
# Step 2: in appengine_config.py add the following snippet:

# see https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request
import requests
import requests_toolbelt.adapters.appengine

# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

# also monkey patch platform.platform() from https://code.google.com/p/googleappengine/issues/detail?id=12982
import platform

def patch(module):
    def decorate(func):
        setattr(module, func.func_name, func)
        return func
    return decorate


@patch(platform)
def platform():
    return 'AppEngine'

Ответ 6

Да, вы можете использовать модуль запросов. GCP не поддерживает использование библиотеки запросов из коробки. Поэтому нам придется сделать несколько твиков, чтобы все заработало. Чтобы развернуть приложение в Google App Engine, нам нужно создать main.py (там, где находится основное приложение с python-флягой) и app.yaml (файл конфигурации, необходимый для его запуска в GCP). Вот пример кода для файла app.yaml для среды Python 2.7

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  redirect_http_response_code: 301
  script: main.app

libraries:
- name: flask
  version: 0.12

Теперь нам нужно настроить библиотеку запросов для внутреннего использования URLfetch. Чтобы использовать запросы, нам нужно установить как запросы, так и запросы -t oolbelt, используя инструкции производителя. (https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#install_a_library). В основном нам нужно установить наши пользовательские библиотеки.

  1. Создайте каталог для хранения ваших сторонних библиотек, таких как lib/mkdir lib
  2. Загрузите запросы и запросы -t библиотеки oolbelt из вашей системы или загрузите их непосредственно в папку lib, созданную на предыдущем шаге.
  3. Используйте pip (версия 6 или новее) с флагом -t, чтобы скопировать библиотеки в папку, созданную на предыдущем шаге. Например: pip install -t lib/(pip install -t lib/запросы)
  4. Создайте файл с именем appengine_config.py в той же папке, что и ваш файл app.yaml.
  5. Отредактируйте файл appengine_config.py и укажите каталог вашей библиотеки для метода vendor.add(). Пример файла appengine_config.py

    from google.appengine.ext import vendor
    # Add any libraries install in the "lib" folder.
    vendor.add('lib/requests')
    vendor.add('lib/requests_toolbelt')
    
  6. После установки используйте модульques_toolbelt.adapters.appengine для настройки запросов на использование URLFetch. Скопируйте приведенный ниже код в начало вашего файла main.py

    import requests
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch(validate_certificate=True)
    

(https://cloud.google.com/appengine/docs/standard/python/issue-requests)

Теперь мы можем легко использовать библиотеку запросов для выполнения запросов get/post. Протестируйте свое приложение:

dev_appserver.py --port=<port number> app.yaml

Ответ 7

Чтобы исправить запросы на работу с Google App Engine, а также разрешить запуск моего приложения за пределами GAE, я добавил следующий код:

try:
    from google.appengine.api import urlfetch
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch()
except ImportError:
    pass