【问题标题】:Accessing Google Drive from a Google App Engine Python app从 Google App Engine Python 应用程序访问 Google Drive
【发布时间】:2013-03-16 21:03:33
【问题描述】:

我有一个现有的具有很多功能的 Google App Engine Python 应用程序。我现在想将 Google Drive 集成到应用程序中。具体来说,我希望我的应用能够:

  1. 在我的用户的 Google Drive 中创建一个空文件,我的用户可以在其中创建 Google Doc。
  2. 从 Google 云端硬盘中检索该文件,以便在我的应用中进行进一步处理。
  3. 定期将其发送回 Google 云端硬盘,以便用户可以将其作为 Google 文档进行进一步编辑。

如果知道如何做我想做的事情的人可以将我引导到满足我的特定要求的特定 Google 网页,我将永远感激不尽(不是一般的答案,例如“请参阅 DrEdit例子”)。提前致谢!

更新:

根据答案 1 中的建议,根据 drive-v2-python-appengine 中生成的示例代码,这是我的带有 RequestHandler 的程序,用于创建一个空文件:

import os
import webapp2

import io

from google.appengine.api import memcache

import httplib2
from apiclient.discovery import build
from apiclient.http import MediaIoBaseUpload
from oauth2client.appengine import oauth2decorator_from_clientsecrets


decorator = oauth2decorator_from_clientsecrets(
    os.path.join(os.path.dirname(__file__), 'client_secrets.json'),
    scope=[
        'https://www.googleapis.com/auth/drive',
    ])

http = httplib2.Http(memcache)
drive_service = build("drive", "v2", http=http)


class CreateEmptyFile(webapp2.RequestHandler):
    @decorator.oauth_required
    def get(self):
        body = {
            'title': 'Sample Document',
            'description': 'A sample document',
            'mimeType': 'text/plain'
        }
        media_body = MediaIoBaseUpload(io.BytesIO(""), mimetype='text/plain', resumable=True)
        file = drive_service.files().insert(body=body, media_body=media_body).execute()
        self.redirect("/synopsis")

测试有点令人困惑,因为有时我运行它时,包括第一次,它会调出访问请求页面,但大多数时候不会。我使用https://accounts.google.com/b/0/IssuedAuthSubTokens?hl=en 撤销了对 Drive 的访问权限,并且 Drive 不再出现在列表中,但我猜想执行访问权限撤销存在一个小时或更长时间的时间延迟。对此不确定,也没有看到它记录在案。

无论如何,如果我注释掉对drive_service.files().insert() 的调用,它不会中止,而是重定向到我的概要页面。我相信这意味着授权工作正常,因为这使它像生成的示例代码一样。

但是,如果我取消注释 insert 并使用 resumable=True 作为媒体正文,我会得到:

ResumableUploadError: Failed to retrieve starting URI.

如果我使用resumable=False,我会得到:

HttpError: <HttpError 401 when requesting https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart&alt=json returned "Login Required">

所以我似乎能够通过 OAuth 2.0 授权,但无法插入文件。

【问题讨论】:

  • 欢迎来到 StackOverflow!请考虑重写您的问题并删除一些与回答无关的段落(如第 4 和第 5 段)。尽量具体一点,因为我必须阅读两遍才能理解你想要什么,而且这个问题的范围似乎很广泛。
  • 很抱歉给您带来不便,感谢您的欢迎和指导。希望我的编辑版本更好。范围并不广泛:我只是希望我的应用能够将文档来回发送到 Google Drive,以便用户可以使用 Google Docs UI 编辑文档,但我也可以在我的应用中使用文档.
  • 我喜欢这个问题 - 你在哪里可以找到“drive-v2-python-appengine”?我在网上找不到。我不喜欢 DrEdit,因为它依赖于很多混淆的 javascript 来运行。寻找更直接的例子。

标签: python google-app-engine google-drive-api


【解决方案1】:

请在以下位置试用我们的快速入门应用: https://developers.google.com/api-client-library/python/start/installation

您可以创建一个快速启动应用引擎应用,这对您创建初始设置很有用。具体用例请参考drive API reference

【讨论】:

  • 谢谢。我试过了。我还在developers.google.com/drive/examples/python 尝试了 DrEdit(我花了几个小时才意识到它与我的要求无关)。通过developers.google.com/drive/quickstart-python,我观看了视频,让应用程序运行,并研究了代码,但到目前为止还没有看到如何将该信息扩展到 GAE 并删除手动流程。回到您建议的页面,我得到:“无效参数”
  • 我想我得到“无效参数”,因为命令应该是“dev_appserver.py”。 (不确定,只是猜测),但这给出了“ValueError('insecure string pickle',)”。根据评论的建议,然后我尝试了“dev_appserver.py --clear_datastore”。这给了“socket.error:[Errno 48]地址已在使用”
  • 我认为这是因为在我的 Mac 上,Apache 已经在使用 8080,我不知道如何修改链接中的示例代码以使用 8081。但是,我将查看生成的代码,看看是否可以将其合并到我正在运行的应用程序中。再次感谢!
  • 好的,我在我的 IDE (PyCharm) 中使用-p 8081 --use_sqlite 运行它,并获得了“恭喜”页面。再次感谢您为我指明正确的方向。
  • 这使得问题和答案对其他人来说不太清楚。您可以还原问题,再次接受并打开一个新问题吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 2012-07-19
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2016-10-04
相关资源
最近更新 更多