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

"ImportError: без модуля с именем _ssl" с dev_appserver.py из Google App Engine


Фон

"В среде выполнения Python мы добавили поддержку Python SSL Библиотека, поэтому теперь вы можете открывать защищенные соединения с удаленными службами например, служба уведомления Apple Push."

Эта цитата взята из недавнего сообщения в блоге Google App Engine.


Реализация

Если вы хотите использовать собственный python ssl, вы должны включить его, используя конфигурацию библиотек в вашем приложении app.yaml, где вы укажете имя библиотеки "ssl".,

Эти инструкции предоставляются разработчикам с помощью документации Google App Engine.

В файл app.yaml добавлены следующие строки:

libraries:
- name: ssl
  version: latest

Это в значительной степени соответствует советам, предоставленным с помощью документации Google App Engine.


Проблема

Я попытался запустить проект в трех разных конфигурациях. Два работают, а другой нет.

Работает...

После того, как я загружу свое приложение в Google App Engine и запускаю свой проект через живой сервер, все работает нормально.

Работает...

Когда я запускаю проект с manage.py runserver и включаю SKD в Google App Engine в моем PYTHONPATH, все работает нормально.

Не работает...

Однако, когда я запускаю проект с помощью dev_appserver.py, я получаю следующую ошибку:

ImportError at /
No module named _ssl
Request Method: GET
Request URL:    http://localhost:8080/
Django Version: 1.4.3
Exception Type: ImportError
Exception Value:    
No module named _ssl
Exception Location: /usr/local/lib/google_appengine_1.7.7/google/appengine/tools/devappserver2/python/sandbox.py in load_module, line 856
Python Executable:  /home/rbose85/Code/venvs/appserver/bin/python
Python Version: 2.7.3
Python Path:    
['/home/rbose85/Code/product/site',
 '/usr/local/lib/google_appengine_1.7.7',
 '/usr/local/lib/google_appengine_1.7.7/lib/protorpc',
 '/usr/local/lib/google_appengine_1.7.7',
 '/usr/local/lib/google_appengine_1.7.7',
 '/usr/local/lib/google_appengine_1.7.7/lib/protorpc',
 '/usr/local/lib/google_appengine_1.7.7',
 '/usr/local/lib/google_appengine_1.7.7/lib/protorpc',
 '/home/rbose85/Code/venvs/appserver/lib/python2.7',
 '/home/rbose85/Code/venvs/appserver/lib/python2.7/lib-dynload',
 '/usr/lib/python2.7',
 '/usr/local/lib/google_appengine',
 u'/usr/local/lib/google_appengine_1.7.7/lib/django-1.4',
 u'/usr/local/lib/google_appengine_1.7.7/lib/ssl-2.7',
 u'/usr/local/lib/google_appengine_1.7.7/lib/webapp2-2.3',
 u'/usr/local/lib/google_appengine_1.7.7/lib/webob-1.1.1',
 u'/usr/local/lib/google_appengine_1.7.7/lib/yaml-3.10']
Server time:    Wed, 24 Apr 2013 11:23:49 +0000
4b9b3361

Ответ 1

Вы можете проверить, доступен ли ssl в вашей локальной системе, открыв оболочку python и набрав import ssl. Если ошибка не появляется, проблема заключается в чем-то другом, иначе у вас нет соответствующих библиотек, установленных в вашей системе. Если вы используете операционную систему Linux, попробуйте sudo apt-get install openssl openssl-devel или соответствующие инструкции для вашей операционной системы установить их локально. Если вы используете окна, это инструкции.

Ответ 2

Для текущей версии GAE (1.8.0 по крайней мере до 1.8.3), если вы хотите иметь возможность отлаживать SSL-соединения в своей среде разработки, вам нужно немного настроить песочницу gae:

  • добавить слова "_ssl" и "_socket" в словарь _WHITE_LIST_C_MODULES в /path -to-gae-sdk/google/appengine/tools/devappserver2/python/sandbox.py
  • Замените файл socket.py, предоставленный google в /path -to-gae-sdk/google/appengine/dis27 из файла socket.py из вашей инфраструктуры Python.

ВАЖНО:. Настройка среды песочницы может привести к функциональности, работающей на вашей локальной машине, но не в производстве (например, GAE поддерживает только исходящие сокеты в процессе производства). Я порекомендую вам восстановить вашу песочницу, когда вы закончите разработку определенной части вашего приложения.

Ответ 3

Решение jmg работает, но вместо изменения файлов sdk вы можете обезвредить соответствующие модули.

Просто поставьте что-то подобное в начале настройки вашего проекта.

# Just taking flask as an example
app = Flask('myapp')

if environment == 'DEV':
    import sys

    from google.appengine.tools.devappserver2.python import sandbox
    sandbox._WHITE_LIST_C_MODULES += ['_ssl', '_socket']

    from lib import copy_of_stdlib_socket.py as patched_socket

    sys.modules['socket'] = patched_socket
    socket = patched_socket

Ответ 4

Мне пришлось использовать немного другой подход, чтобы заставить это работать в CircleCI (неуверенность в том, какая особенность в их конфигурации venv вызвала это):

appengine_config.py

import os

if os.environ.get('SERVER_SOFTWARE', '').startswith('Development'):
    import imp
    import os.path
    import inspect
    from google.appengine.tools.devappserver2.python import sandbox

    sandbox._WHITE_LIST_C_MODULES += ['_ssl', '_socket']
    # Use the system socket.

    real_os_src_path = os.path.realpath(inspect.getsourcefile(os))
    psocket = os.path.join(os.path.dirname(real_os_src_path), 'socket.py')
    imp.load_source('socket', psocket)

Ответ 5

Наткнулся на эту тему, пытаясь работать с службой уведомлений Apples Push и appengine... Я смог получить эту работу без каких-либо попыток обезьян, добавив библиотеку SSL в свой app.yaml, как рекомендовано в официальные документы, надеюсь, что это поможет кому-то еще:)

Ответ 6

Я добавил код в appengine_config.py, как указано в Spanish Train, но должен был также добавить следующий код, чтобы заставить это работать:

phttplib = os.path.join(os.path.dirname(real_os_src_path), 'httplib.py')
imp.load_source('httplib', phttplib)

Ответ 7

У меня была эта проблема, потому что я не продавал ssl в своем файле app.yaml. Я знаю, что OP сделал это, но для тех, кто приземлился здесь из-за ошибки OP, стоит убедиться, что строки, подобные приведенным ниже, находятся в вашем файле app.yaml:

libraries:
- name: ssl
  version: latest