Можно ли использовать Requests в Google App Engine? Я думаю, что эта библиотека идеально подходит для создания клиента REST.
Может ли библиотека запросов Python использоваться в Google App Engine?
Ответ 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'
Ответ 5
Нет, в недавнем сообщении разработчики говорят, что они не поддерживают GAE, потому что он слишком отличается от python.
Ответ 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). В основном нам нужно установить наши пользовательские библиотеки.
- Создайте каталог для хранения ваших сторонних библиотек, таких как lib/mkdir lib
- Загрузите запросы и запросы -t библиотеки oolbelt из вашей системы или загрузите их непосредственно в папку lib, созданную на предыдущем шаге.
- Используйте pip (версия 6 или новее) с флагом -t, чтобы скопировать библиотеки в папку, созданную на предыдущем шаге. Например: pip install -t lib/(pip install -t lib/запросы)
- Создайте файл с именем appengine_config.py в той же папке, что и ваш файл app.yaml.
-
Отредактируйте файл 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')
-
После установки используйте модуль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