google-app-engine - 在 Google App Engine 上,python SSLError: 无法连接到 HTTPS URL,因为SSL模块不可用

我想使用微信sdk创建菜单


WeChat.create_menu({


"button":[


 { 


"type":"click",


"name":"Daily Song",


"key":"V1001_TODAY_MUSIC"


 },


 {


"type":"click",


"name":" Artist Profile",


"key":"V1001_TODAY_SINGER"


 },


 {


"name":"Menu",


"sub_button":[


 { 


"type":"view",


"name":"Search",


"url":"http://www.soso.com/"


 },


 {


"type":"view",


"name":"Video",


"url":"http://v.qq.com/"


 },


 {


"type":"click",


"name":"Like us",


"key":"V1001_GOOD"


 }]


 }]


 })



由于这个错误,当前无法工作:


Traceback (most recent call last):


 File"/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in Handle


 result = handler(dict(self._environ), self._StartResponse)


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1519, in __call__


 response = self._internal_error(e)


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1511, in __call__


 rv = self.handle_exception(request, response, e)


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__


 rv = self.router.dispatch(request, response)


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher


 return route.handler_adapter(request, response)


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__


 return handler.dispatch()


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 547, in dispatch


 return self.handle_exception(e, self.app.debug)


 File"/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch


 return method(*args, **kwargs)


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechatAPIHandler.py", line 72, in post


"key":"V1001_GOOD"


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 355, in create_menu


 data=menu_data


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 949, in _post


 **kwargs


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 907, in _request


"access_token": self.access_token,


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 849, in access_token


 self.grant_token()


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 273, in grant_token


"secret": self.__appsecret,


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 935, in _get


 **kwargs


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/wechat_sdk/basic.py", line 917, in _request


 **kwargs


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/requests/api.py", line 50, in request


 response = session.request(method=method, url=url, **kwargs)


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/requests/sessions.py", line 465, in request


 resp = self.send(prep, **send_kwargs)


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/requests/sessions.py", line 573, in send


 r = adapter.send(request, **kwargs)


 File"/base/data/home/apps/s~project-boom/1.384461758981660124/requests/adapters.py", line 431, in send


 raise SSLError(e, request=request)


SSLError: Can't connect to HTTPS URL because the SSL module is not available.



python请求模块包含在app engine项目中。

时间:

如果使用GAE的套接字,只需加载SSL库就可以获得SSL支持,而无需hack。

只需将它添加到app.yaml文件:


libraries:


- name: ssl


 version: latest



这篇文章详细描述了一个解决方案,

问题是GAE有一个选择标准库的“白名单"。但SSL (_ssl, _socket)不在其中。下面的代码使用标准python套接字库,而不是开发环境中的GAE-provided,修改[或创建] appengine_config.py:


import os



# Workaround the dev-environment SSL


# http://stackoverflow.com/q/16192916/893652


if os.environ.get('SERVER_SOFTWARE', '').startswith('Development'):


 import imp


 import os.path


 from google.appengine.tools.devappserver2.python import sandbox



 sandbox._WHITE_LIST_C_MODULES += ['_ssl', '_socket']


 # Use the system socket.


 psocket = os.path.join(os.path.dirname(os.__file__), 'socket.py')


 imp.load_source('socket', psocket)



...