Можно ли использовать библиотеку Python Requests в Google App Engine? - PullRequest
31 голосов
/ 07 марта 2012

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

Ответы [ 7 ]

40 голосов
/ 18 мая 2016

Установить библиотеку 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)

26 голосов
/ 16 февраля 2015

Да.В 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 запроса.

  'module' object has no attribute 'PROTOCOL_SSLv3'

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

8 голосов
/ 19 сентября 2016

теперь это возможно, я получил его с помощью этой комбинации обходных путей в 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'
8 голосов
/ 07 апреля 2012

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

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

3 голосов
/ 23 июля 2014

Нет, в более свежем сообщении разработчики говорят, что они не поддерживают GAE, потому что он слишком отличается от python.

0 голосов
/ 06 января 2019

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

try:
    from google.appengine.api import urlfetch
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch()
except ImportError:
    pass
0 голосов
/ 17 сентября 2018

Да, вы можете использовать модуль запросов.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.Чтобы использовать запросы, нам нужно установить и запросы, и запросы-инструментарий, используя инструкции производителя.(https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library). По сути, нам нужно установить наши пользовательские библиотеки.

  1. Создать каталог для хранения ваших сторонних библиотек, таких как lib / mkdir lib
  2. Загрузитьзапрашивает и запрашивает библиотеки инструментов из вашей системы или загружает их непосредственно в папку 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. После установки используйтемодуль examples_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
...