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

rbo*_*e85 24 google-app-engine openssl


背景

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

此引用来自Google App Engine博客上的最新帖子.


履行

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

这些说明是通过Google App Engine文档为开发人员提供的.

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

libraries:
- name: ssl
  version: latest
Run Code Online (Sandbox Code Playgroud)

这与Google App Engine文档中提供的建议一致.


问题

我试过用三种不同的配置来运行我的项目.两个正在工作,一个不工作.

工作......

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

工作......

当我在我的项目中运行manage.py runserver并包含Google App Engine SKD时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
Run Code Online (Sandbox Code Playgroud)

jmg*_*jmg 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
  • 将Python中提供的socket.py文件替换为来自Python框架的socket.py文件中的/ path-to-gae-sdk/google/appengine/dis27.

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

  • 对于那些不知道在哪里找到"路径到达"的人(像我一样)只是一张纸条.在你的终端运行:`ls -l \`,dev_appserver.py \``这将显示真正的路径.在`google_appengine`目录上执行`cd`,然后执行`cd google/appengine/tools/devappserver2/python /`. (3认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

  • `from lib import copy_of_stdlib_socket.py as patched_socket`这是关于什么的?PyCharm说"找不到模块". (3认同)

Spa*_*ain 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)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案似乎是最安全的路线,应该加以标记.我将添加它应该放在你的基本应用程序目录中名为`appengine_config.py`的文件中,以便它在启动时加载. (2认同)

far*_*dav 5

偶然发现这个线程尝试使用Apples推送通知服务和appengine ...我能够通过在我的app.yaml中添加SSL库,没有任何猴子修补工作,正如官方文档中所推荐的那样,希望有所帮助其他人 :)


ham*_*x0r 5

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

libraries:
- name: ssl
  version: latest
Run Code Online (Sandbox Code Playgroud)


top*_*ess -1

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

  • 您的问题有什么解决办法吗?也遇到了。 (2认同)