"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
Ответы
Ответ 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