24

背景

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

这句话摘自 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并将 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
4

7 回答 7

46

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

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

重要提示:调整沙盒环境可能会导致功能在您的本地机器上运行,但在生产中不可用(例如,GAE 仅支持生产中的出站套接字)。我会建议您在开发完应用程序的特定部分后恢复您的沙盒。

于 2013-06-05T10:34:56.400 回答
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
于 2014-06-05T17:48:39.170 回答
6

我遇到了这个问题,因为我没有ssl在我的 app.yaml 文件中进行销售。我知道 OP 是这样做的,但是对于那些因 OP 的错误而登陆这里的人,值得确保您的 app.yaml 文件中有以下行:

libraries:
- name: ssl
  version: latest
于 2018-12-12T22:09:28.400 回答
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)
于 2015-08-12T03:17:17.517 回答
5

偶然发现这个线程试图与Apples Push通知服务和appengine一起工作......我能够通过在我的app.yaml中添加SSL库,在没有任何猴子补丁的情况下完成这个工作,正如官方文档中所推荐的那样,希望有帮助其他人 :)

于 2016-05-27T09:24:33.763 回答
1

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

phttplib = os.path.join(os.path.dirname(real_os_src_path), 'httplib.py')
imp.load_source('httplib', phttplib)
于 2015-10-14T02:23:59.623 回答
-1

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

于 2013-04-25T14:02:22.197 回答