【问题标题】:Dropbox Python SDK SSL errorDropbox Python SDK SSL 错误
【发布时间】:2012-11-06 23:56:29
【问题描述】:

我正在学习如何使用 Dropbox Python SDK。但是,当我尝试生成请求令牌时遇到了问题。这是我正在使用的代码(请注意,我在这里用 APP_KEY 和 APP_SECRET 替换了我的实际应用程序密钥和秘密,但我在尝试时使用了我的实际应用程序密钥和秘密。)

from dropbox import client, rest, session
APP_KEY = 'APP_KEY'
APP_SECRET = 'APP_SECRET'
ACCESS_TYPE = 'app_folder'
print 'Creating session object'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
print 'Session created!\nCreating request token'
request_token = sess.obtain_request_token()
print 'Created request token!'
url = sess.build_authorize_url(request_token)
print url
raw_input()
access_token = sess.obtain_access_token(request_token)
client1 = client.DropboxClient(sess)
print client1.account_info()

我让程序在创建不同对象时打印出消息,以便我可以看到错误发生的位置。这是输出:

aaron@Aarons-Ubuntu-Computer:~/Twisted$ python example.py
Creating session object
Session created!
Creating request token
Traceback (most recent call last):
  File "example.py", line 8, in <module>
    request_token = sess.obtain_request_token()
File "/usr/local/lib/python2.7/dist-packages/dropbox-1.4-py2.7.egg/dropbox/session.py", line 160, in obtain_request_token
response = rest.RESTClient.POST(url, headers=headers, params=params, raw_response=True)
File "/usr/local/lib/python2.7/dist-packages/dropbox-1.4-py2.7.egg/dropbox/rest.py", line 140, in POST
  return cls.request("POST", url, post_params=params, headers=headers, raw_response=raw_response)
File "/usr/local/lib/python2.7/dist-packages/dropbox-1.4-py2.7.egg/dropbox/rest.py", line 64, in request
  conn = ProperHTTPSConnection(host, 443)
File "/usr/local/lib/python2.7/dist-packages/dropbox-1.4-py2.7.egg/dropbox/rest.py", line 214, in __init__
  self.cert_reqs = ssl.CERT_REQUIRED
AttributeError: 'module' object has no attribute 'CERT_REQUIRED'

我之前曾尝试使用此代码,但没有遇到此问题。我还删除了 Dropbox SDK 并重新安装它,但没有任何结果。是什么导致了这个问题,我该如何解决?

更新

添加 Kannan 的代码后,输出如下所示: Ready Generating session Session Generated! Generating request token ['Certificate', 'CertificateOptions', 'CertificateRequest', 'Client', 'ClientContextFactory', 'Connector', 'ContextFactory', 'DN', 'DefaultOpenSSLContextFactory', 'DistinguishedName', 'KeyPair', 'Port', 'PrivateCertificate', 'SSL', 'Server', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'implementedBy', 'implements', 'implementsOnly', 'interfaces', 'supported', 'tcp'] 然后我得到错误。我试过重新创建我的 SSL 证书,但没有成功。

【问题讨论】:

  • 你也做过print ssl.__file___吗?从 dir(ssl) 结果来看,您似乎得到了 Twisted 的 twisted.internet.ssl 而不是标准的 ssl。也许您的导入路径搞砸了?
  • 你是对的! ssl.__file__ 打印出 /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyc。我忘记了我导入了 *-twisted.internet.ssl,这样我就可以在我的客户端和服务器程序之间建立一个安全的连接。我尝试将 import 语句更改为 from twisted.internet import ssl a twisted_ssl 以便它不会干扰 Dropbox,并更新了 reactor 中对 ssl 的引用.listenSSL。不过,我仍然遇到 ssl.CERT_REQUIRED 错误。
  • Dropbox SDK 执行 import ssl,所以我不知道为什么要导入 twisted.internet.ssl。检查您的 PYTHONPATH 环境变量,以确保它没有设置为包含过多的内容。

标签: python ssl dropbox-api


【解决方案1】:

我遇到了同样的错误。我试过你的建议,结果ssl模块没有属性'file',只有['doc', 'loader', 'name', 'package'] 当我打印 dir(ssl) 时。另外值得注意的是,当我在谷歌应用引擎中尝试 print str(ssl) 时,我看到: 模块“ssl”(内置) 但是当我从命令行运行 python 时,我看到: 来自“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.pyc”的模块“ssl” 并且命令行中的 ssl 具有 file 属性。

不确定 ssl 是如何被劫持的......但我很确定它是。

编辑:loader 是 google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook 对象,位于 0x1142684d0

编辑:在这里发现了一个相关问题:SSLError on Google App Engine (local dev-server)

【讨论】:

    【解决方案2】:

    这很奇怪。 Python 2.7 文档肯定提到了ssl.CERT_REQUIRED

    尝试修改 SDK,并在失败行之前添加

    print dir(ssl)
    print ssl.__file__
    

    这可能会帮助您找出问题所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      相关资源
      最近更新 更多