使用来自Google App Engine的dev_appserver.py的“ImportError:没有名为_ssl的模块”

时间:2013-04-24 13:10:11

标签: google-app-engine openssl


背景

  

“在Python运行时,我们添加了对Python SSL的支持   库,因此您现在可以打开与远程服务的安全连接   例如Apple的Push Notification服务。“

此引用为taken from a recent post on the Google App Engine blog


实施

  

如果要使用本机python ssl,则必须使用应用程序的app.yaml文件中的库配置启用它,在该文件中指定库名称“ssl”。 。 。

这些说明是通过Google App Engine documentation为开发人员提供的。

app.yaml文件中添加了以下行:

libraries:
- name: ssl
  version: latest

这与通过Google App Engine文档提供的建议一致。


问题

我尝试过以三种不同的配置运行我的项目。两个正在工作,一个不工作。

工作......

将我的应用程序上传到Google App Engine并通过实时服务器运行我的项目后,一切正常。

工作......

当我使用manage.py runserver运行我的项目并在我的PYTHONPATH中包含Google App Engine SKD时,一切正常。

不工作......

但是,当我使用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

7 个答案:

答案 0 :(得分:46)

对于当前的GAE版本(1.8.0至少到1.8.3),如果您希望能够在开发环境中调试SSL连接,则需要稍微调整一下gae沙箱:

  • 将“_ssl”和“_socket”键添加到/path-to-gae-sdk/google/appengine/tools/devappserver2/python/sandbox.py
  • 中的字典_WHITE_LIST_C_MODULES
  • 将来自/ framework-to-gae-sdk / google / appengine / dis27中google提供的socket.py文件替换为Python框架中的socket.py文件。

重要事项:调整沙箱环境可能最终会在本地计算机上运行但不在生产环境中运行(例如,GAE仅支持生产中的出站套接字)。当您完成应用程序的特定部分的开发后,我会建议您恢复沙盒。

答案 1 :(得分:16)

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

答案 2 :(得分:6)

我必须使用稍微不同的方法才能在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)

答案 3 :(得分:5)

偶然发现这个线程正在尝试使用Apples推送通知服务和appengine ...我能够通过在我的app.yaml中添加SSL库而不需要任何猴子补丁来实现这一点,如{{3希望能帮助别人:)

答案 4 :(得分:5)

我遇到了这个问题,因为我没有在我的app.yaml文件中出售ssl。我知道OP可以做到这一点,但是对于那些因OP错误而登陆此处的人来说,值得确保app.yaml文件中包含以下内容:

libraries:
- name: ssl
  version: latest

答案 5 :(得分:1)

我将代码添加到西班牙列车列出的appengine_config.py中,但还必须添加以下代码以使其正常工作:

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

答案 6 :(得分:-1)

您可以通过打开python shell并键入import ssl来测试本地系统中ssl是否可用。如果没有出现错误,则问题是其他问题,否则您的系统上没有安装相关库。如果您使用的是Linux操作系统,请尝试sudo apt-get install openssl openssl-devel或操作系统的相关说明在本地安装它们。如果您使用的是Windows,则为instructions