“ImportError: No module named _ssl” avec dev_appserver.py à partir de Google App Engine
Fond
"Dans le runtime de Python, nous avons ajouté le support pour le Python SSL
De la bibliothèque, de sorte que vous pouvez maintenant ouvrir des connexions sécurisées à des services distants
comme Apple Push Notification service."
Cette citation est prises à partir d'un post récent sur le Google App Engine blog.
Mise en œuvre
Si vous souhaitez utiliser natif python ssl, vous devez l'activer en utilisant les bibliothèques de configuration de votre application.fichier yaml, où vous indiquez le nom de la bibliothèque "ssl" . . .
Ces instructions sont fournies pour les développeurs par le biais de la Google App Engine documentation.
Les lignes suivantes ont été ajoutées à la app.yaml
fichier:
libraries:
- name: ssl
version: latest
Ce qui est en ligne avec les conseils fournis par le biais de Google App Engine documentation.
Problème
J'ai essayé de lancer mon projet en trois configurations différentes. Les deux sont de travail, et l'un ne l'est pas.
De travail ...
Après je télécharger mon application Google App Engine, et d'exécuter mon projet par le serveur, tout fonctionne bien.
De travail ...
Quand je lance mon projet avec manage.py runserver
et comprennent le Google App Engine SKD dans mon PYTHONPATH
, tout fonctionne bien.
Ne Fonctionne Pas ...
Cependant, lorsque je lance mon projet avec dev_appserver.py
, j'obtiens l'erreur suivante:
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez tester si le protocole ssl est disponible sur votre système local par l'ouverture d'un python shell et en tapant
import ssl
. Si aucune erreur n'apparaît, alors le problème est autre chose, sinon, vous n'avez pas pertinentes bibliothèques installées sur votre système. Si vous utilisez un système d'exploitation Linux essayezsudo apt-get install openssl openssl-devel
ou les instructions pertinentes pour votre système d'exploitation pour installer localement. Si vous utilisez windows, ce sont les instructions.import ssl
je peux très rapidement tester si un module SSL est disponible à mon environnement. Cependant, je ne suis pas en essayant de travailler avec SSL sur mon local Python. Le problème que j'ai est de travailler avec des SSL dans Google App Engine. Je suis en mesure d'exécuter mon projet, sans problème, par le biais de Django reinhardt,manage.py runserver
. Le problème est lors de l'exécution de mon projet par le biais de AppEngine estdev_appserver.py
. Lorsque j'utilisedev_appserver.py
- je obtenir de la question.Pour le courant GAE version 1.8.0 au moins jusqu'à ce que 1.8.3), si vous voulez être en mesure de déboguer les connexions SSL dans votre environnement de développement, vous aurez besoin de modifier un peu le gae sandbox:
IMPORTANT: Peaufinage de l'environnement sandbox peut se retrouver avec des fonctionnalités de travail en local sur votre machine, mais pas dans la production (par exemple, GAE prend uniquement en charge les sortants des sockets en production). Je vous recommande de restaurer votre bac à sable lorsque vous avez terminé le développement de cette partie spécifique de votre application.
path-to-gae
. Exécuter dans votre Terminal:ls -l `which dev_appserver.py`
cela va vous montrer le vrai chemin. Faire uncd
sur legoogle_appengine
dir, puiscd google/appengine/tools/devappserver2/python/
.La solution par jmg fonctionne, mais au lieu de changer le sdk fichiers, vous pouvez le singe patch les modules pertinents.
Vient de mettre quelque chose comme ceci sur le début de votre projet d'installation.
select
). L'ajout de ces deux lignes pour le correctif, juste en dessous deimport sys
va désactiver les sockets non bloquant entièrement:import select
et puisdel sys.modules['select'].select
.from lib import copy_of_stdlib_socket.py as patched_socket
C'est quoi, la ligne de sujet? PyCharm dit "module non trouvé."copy_of_stdlib_socket.py
, l'idée est littéralement copier le Python de basesocket.py
fichier dans un nouveau fichier dans votre arborescence du projet, avec un nom commecopy_of_stdlib_socket.py
, puis de les importer. Il y a quelque chose de substitution de la socket par défaut du module, et nous voulons le remplacer en arrière.socket.py
dans un nouveau fichier, par cette réponse: stackoverflow.com/a/36272309/1464495.J'ai eu à utiliser une approche légèrement différente pour obtenir ce travail dans CircleCI (pas sûr de ce qu'particularité de leur venv config causé ce):
appengine_config.py
appengine_config.py
dans votre base de répertoire app afin qu'il soit chargé au démarrage.Suis tombé sur ce fil de discussion en essayant de travailler avec des Pommes service de notification Push et appengine... j'ai été en mesure d'obtenir ce travail sans aucune monkey patching, par l'ajout de la bibliothèque SSL dans mon application.yaml, comme recommandé dans le officiel docs, de l'espoir, qui permet à quelqu'un d'autre 🙂
J'ai eu ce problème parce que je n'étais pas vendoring
ssl
dans mon application.fichier yaml. Je sais que l'OP n'a qu', mais pour ceux qui débarquent ici pour l'OP est une erreur, il vaut la peine de faire assurer lignes comme celle-ci sont dans votre application.fichier yaml:J'ai ajouté le code pour appengine_config.py comme indiqué par l'Espagne en Train, mais avait également ajouter le code suivant ainsi à obtenir que cela fonctionne: