“ImportError: ningún módulo llamado _ssl” con dev_appserver.py de Google App Engine


Fondo

“En el tiempo de ejecución de Python, hemos agregado soporte para la biblioteca de Python SSL, por lo que ahora puede abrir conexiones seguras a servicios remotos, como el servicio de notificación push de Apple”.

Esta cita está tomada de una publicación reciente en el blog de Google App Engine .


Implementación

Si desea utilizar python ssl nativo, debe habilitarlo utilizando la configuración de bibliotecas en el archivo app.yaml de su aplicación donde especifica el nombre de la biblioteca “ssl”. . .

Estas instrucciones se proporcionan para los desarrolladores a través de la documentación de Google App Engine .

Las siguientes líneas se han agregado al archivo app.yaml :

 libraries: - name: ssl version: latest 

Esto está en línea con los consejos proporcionados a través de la documentación de Google App Engine.


Problema

He intentado ejecutar mi proyecto en tres configuraciones diferentes. Dos están trabajando, y uno no.

Trabajando …

Después de subir mi aplicación a Google App Engine y ejecutar mi proyecto a través del servidor en vivo, todo funciona bien.

Trabajando …

Cuando ejecuto mi proyecto con manage.py runserver e manage.py runserver el Google App Engine SKD en mi PYTHONPATH , todo funciona bien.

No funciona …

Sin embargo, cuando ejecuto mi proyecto con dev_appserver.py , dev_appserver.py el siguiente error:

 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 

Puede probar si ssl está disponible en su sistema local abriendo un shell de python y escribiendo import ssl . Si no aparece ningún error, entonces el problema es otra cosa, de lo contrario no tendrá las bibliotecas relevantes instaladas en su sistema. Si está utilizando un sistema operativo Linux, intente sudo apt-get install openssl openssl-devel o las instrucciones relevantes para que su sistema operativo los instale localmente. Si está usando Windows, estas son las instrucciones .

Para la versión actual de GAE (1.8.0 al menos hasta 1.8.3), si desea poder depurar conexiones SSL en su entorno de desarrollo, necesitará modificar un poco el entorno limitado de gae:

  • agregue las claves “_ssl” y “_socket” al diccionario _WHITE_LIST_C_MODULES en /path-to-gae-sdk/google/appengine/tools/devappserver2/python/sandbox.py
  • Reemplace el archivo socket.py provisto por google en / path-to-gae-sdk / google / appengine / dis27 del archivo socket.py de su framework de Python.

IMPORTANTE: ajustar el entorno de la zona de pruebas puede terminar con una funcionalidad que funcione en su máquina local pero no en la producción (por ejemplo, GAE solo admite sockets de salida en producción). Le recomendaré que restaure su sandbox cuando termine de desarrollar esa parte específica de su aplicación.

La solución de jmg funciona, pero en lugar de cambiar los archivos sdk, podría parchear los módulos relevantes.

Simplemente ponga algo como esto al comienzo de la configuración de su proyecto.

 # 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 

Tuve que usar un enfoque ligeramente diferente para hacer que esto funcionara en CircleCI (no estoy seguro de qué peculiaridad sobre su configuración de venv causó esto):

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) 

Tropecé con este hilo tratando de trabajar con el servicio de notificación Push Apples y appengine … Pude hacer que funcionara sin parche de monos, agregando la biblioteca SSL en mi app.yaml, como se recomienda en los documentos oficiales , espero que eso ayude alguien más 🙂

Agregué el código a appengine_config.py como aparece en Spain Train, pero también tuve que agregar el siguiente código para que esto funcione:

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