Google提供了一个python code sample,用于使用可扩展消息传递和状态协议(XMPP)发送GCM通知。该指南没有具体提到“import xmpp
”的来源。然而,这与xmpppy密切相关。
不幸的是,这个xmpppy项目似乎在很多年前就被抛弃了。最后一个版本发布于2009年。难怪与当前版本的openssl
不兼容Traceback (most recent call last):
File "google_ccs.py", line 54, in <module>
client.connect(server=(SERVER,PORT), secure=1, use_srv=False)
File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/client.py", line 200, in connect
if not CommonClient.connect(self,server,proxy,secure,use_srv) or secure<>None and not secure: return self.connected
File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/client.py", line 178, in connect
transports.TLS().PlugIn(self,now=1)
File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/transports.py", line 281, in PlugIn
if now: return self._startSSL()
File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/transports.py", line 316, in _startSSL
tcpsock._sslIssuer = tcpsock._sslObj.issuer()
AttributeError: '_ssl._SSLSocket' object has no attribute 'issuer'
这个特殊的堆栈跟踪是在Amazon Linux上(2015年9月发布)。的OpenSSL 1.0.1k-14.89.amzn1.x86_64。它也可以在其他发行版上看到。实际上,在将xmpppy作为依赖项的其他项目中可以看到几乎相同的堆栈跟踪。怎么解决这个问题?
答案 0 :(得分:2)
第一个解决方案是修补xmpp/transports.py
补丁来自free-bsd,但适用于Linux。
第二种解决方案是切换到没有此问题的fork of xmpppy。您可以按如下方式安装它。
source /myvirtualenv/bin/activate/
pip uninstall xmpppy
wget https://github.com/ArchipelProject/xmpppy/archive/master.zip
tar -xvf master
cd xmpppy-master
python setup.py build
python setup.py install
现在SSL错误消失了。您可能对使用2年前而不是7年前更新过的代码的知识感到满意!此解决方案适用于将xmpppy作为依赖项且不仅限于GCM的任何项目。
这两个解决方案都是在Eventlet bug report中发现的。
更新: 您甚至可以使用pip来安装fork。
pip install https://github.com/ArchipelProject/xmpppy/archive/master.zip