从GAE将文件写入Dropbox帐户

eri*_*kCo 16 google-app-engine dropbox-api

我正在尝试从GAE应用程序创建Dropbox.com文件夹中的文件.我已经完成了注册Dropbox应用程序的所有步骤,并在我的开发机器上本地安装了Dropbox本地的Python SDK.(请参阅dropbox.com API).当我在本地计算机上的Dropbox SDK中使用cli_client.py测试脚本访问dropbox时,它完全可以正常工作 - 可以'放'文件等.

我现在想开始在GAE环境中工作,所以事情变得有点棘手.一些帮助会很有用.

对于那些熟悉Dropbox API代码的人,到目前为止我遇到了以下问题:

问题1

rest.py Dropbox API模块使用pkg_resources来获取本地计算机安装的site-packages中安装的证书.我换了

TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
Run Code Online (Sandbox Code Playgroud)

TRUSTED_CERT_FILE = file('trusted-certs.crt')
Run Code Online (Sandbox Code Playgroud)

并将cert文件放在我的GAE应用程序目录中.也许这不太对劲; 请参阅下面的验证错误代码.

问题2

session.py的Dropbox API模块使用OAuth的模块,所以我改变了包括对AppEngine上的OAuth.

但提出了一个例外,即GAE的oauth没有Dropbox session.py模块使用的OAuthConsumer方法.所以我下载了oauth 1.0并添加到我的应用程序中,现在导入这个而不是GAE oauth.

问题3

GAE ssl模块似乎没有CERT_REQUIRED属性.

这是一个常数,所以我改变了

self.cert_reqs = ssl.CERT_REQUIRED
Run Code Online (Sandbox Code Playgroud)

self.cert_reqs = 2
Run Code Online (Sandbox Code Playgroud)

这在调用时使用

ssl.wrap_socket(sock, cert_reqs=self.cert_reqs, ca_certs=self.ca_certs)
Run Code Online (Sandbox Code Playgroud)

授权错误

但我仍然无法连接到Dropbox:

Status: 401
Reason: Unauthorized
Body: {"error": "Authentication failed"}
Headers: [('date', 'Sun, 19 Feb 2012 15:11:12 GMT'), ('transfer-encoding', 'chunked'), ('connection', 'keep-alive'), ('content-type', 'application/json'), ('server', 'dbws')]
Run Code Online (Sandbox Code Playgroud)

Art*_*oul 7

这是我的Dropbox Python SDK 1.4的修补版本,适用于Python 2.7 GAE:dropbox_python_sdk_gae_patched.7z.base64.不需要额外的第三方库,只需要GAE环境提供的库.

仅测试文件上载(put_file).这是设置步骤:

  1. 将存档解压缩到GAE应用程序的根文件夹(如果主应用程序位于根文件夹中).您可以使用Base64编码器/解码器解码BASE64 : base64.exe -d dropbox_python_sdk_gae_patched.7z.base64 dropbox_python_sdk_gae_patched.7z.
  2. 设置APP_KEY,APP_SECRET,ACCESS_TYPE,ACCESS_TOKEN_KEY,ACCESS_TOKEN_SECRET.前三个是在Dropbox应用程序创建时配置的.在授予对特定保管箱帐户的应用程序访问权限时,可以获得最后两个,您可以通过token_store.txt文件从cli_client.py(来自DB Python SDK)获取它们.
  3. 在代码中使用如下:

    import dropbox
    # ...
    def DropboxUpload(path, data):
        sess = dropbox.session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
        sess.set_token(ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)
        cli = dropbox.client.DropboxClient(sess)
        data_file = StringIO.StringIO(data)
        return cli.put_file(path, data_file)
    # ...
    import json
    class DropboxUploadHandlerExample(webapp2.RequestHandler):
        def get(self):
            url = "http://www.google.com/"
            result = urlfetch.fetch(url)
            self.response.headers['Content-Type'] = 'application/json'
            self.response.out.write(json.dumps(DropboxUpload('/fetch_result.dat', result.content)))
    
    Run Code Online (Sandbox Code Playgroud)