gpt4 book ai didi

google-app-engine - 在 Google Apps Engine python 项目中使用带有服务帐户的 Google Drive API 进行本地调试

转载 作者:太空宇宙 更新时间:2023-11-03 15:22:10 24 4
gpt4 key购买 nike

在过去的几天里(在我可以花在这个项目上的奇数小时),我一直在努力开始使用带有 GAE python 服务帐户的 Google Drive API 进行本地调试。

我的设置:

  • Eclipse 4.4
  • 适用于 Python 的 Google App Engine SDK 1.8.0
  • Google API 客户端 Python GAE 1.1

  • 我已经在 app.yaml 中激活(除其他外)这些 3rd 方库:
    - name: pycrypto
    version: latest
    - name: ssl
    version: latest

    这就是我对到目前为止设置的理解,在几个陈述中:
  • 因为我的应用程序不需要访问用户文件,而是特定于该应用程序的文件,该应用程序应该使用“服务帐户”来拥有和访问 Google Drive 上的文件
  • 服务帐户可以通过两种方式进行身份验证:(1) 通过 API key 和 (2) 通过私钥凭据
  • 使用 SDK 开发 GAE 应用程序时,需要考虑两种环境:本地系统(用于调试)和 GAE 服务器(用于部署)
  • 在本地系统上运行时,API key 身份验证不起作用(并且永远不会起作用),因为是两条腿的身份验证(不要完全掌握这个...,但似乎是真的)

  • 真的很想要本地调试工具,因为我在学python,也在学google驱动接口(interface),所以在服务器上调试是个很大的负担。

    所以我需要获取在本地系统上工作的私钥凭据。但是后来我遇到了“ImportError:无法导入名称SignedJwtAssertionCredentials”的问题。尝试了我在网上找到的几乎所有内容:
  • 使用 python 2.7 运行时并启用 pycrypto 库
  • 将 google-api-python-client-gae 升级到 1.1(包括此修复程序)
  • 在我的系统上安装了 OpenSSL(但可能没有成功设置正确的路径)
  • 阅读在本地安装 pycrypto 的说明,但假设它们已经过时

  • => 我的第一个问题,只是为了理解,是:是否有可能在您的本地系统上使用 Python 从 GAE SDK 到 Google Drive API 进行身份验证?也许答案很简单“不”?

    => 如果答案是"is",那么是否会有示例设置和代码示例来展示实现此本地身份验证的方法?

    => 错误日志(如下)似乎表明 pycrypto 仍然存在不可用的问题,但文档非常明确地说它包含在 Python 2.7 GAE 运行时环境中。

    => 也许(请确认)我对本地和服务器 python 设置之间的差异感到困惑。当我在 Eclipse 中查看“运行本地”PYTHONPATH 时,它包括(1)我的项目文件夹,(2)google-api-client-python-gae 文件夹(似乎不包括 pycrypto!!),而GAE 运行时可以 --- 有什么区别? (3) 我的本地 Python 2.7 部署。那么这个本地配置中缺少什么我需要模仿服务器配置才能开始调试?

    这是我使用私钥凭据进行身份验证的代码:
    from oauth2client.client import SignedJwtAssertionCredentials
    f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb')
    key = f.read()
    f.close()
    credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=OAUTH_SCOPE)
    http = httplib2.Http()
    http = credentials.authorize(http)
    return build('drive', 'v2', http=http)

    这是我的错误日志:
    ERROR    2013-06-18 00:59:57,562 dev_appserver_import_hook.py:1251] Third party package Crypto was enabled in app.yaml but not found on import. You may have to download and install it.
    ERROR 2013-06-18 00:59:59,255 dev_appserver_import_hook.py:1251] Third party package Crypto was enabled in app.yaml but not found on import. You may have to download and install it.
    ERROR 2013-06-18 00:59:59,289 webapp2.py:1552] import_string() failed for 'illustrations.SyncHandler'. Possible reasons are:

    - missing __init__.py in a package;
    - package or module path not included in sys.path;
    - duplicated package or module name taking precedence in sys.path;
    - missing module, class, function or variable;

    Original exception:

    ImportError: cannot import name SignedJwtAssertionCredentials

    Debugged import:

    - 'illustrations' not found.
    Traceback (most recent call last):
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1272, in default_dispatcher
    self.handlers[handler] = handler = import_string(handler)
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1850, in import_string
    return getattr(__import__(module, None, None, [obj]), obj)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
    return func(self, *args, **kwargs)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1766, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
    return func(self, *args, **kwargs)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1630, in FindAndLoadModule
    description)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
    return func(self, *args, **kwargs)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1577, in LoadModuleRestricted
    description)
    File "C:\Users\vic\Dropbox\Development\Eclipse-juno-workspace\Missale\src\illustrations.py", line 6, in <module>
    import drive
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
    return func(self, *args, **kwargs)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1766, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
    return func(self, *args, **kwargs)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1630, in FindAndLoadModule
    description)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
    return func(self, *args, **kwargs)
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1577, in LoadModuleRestricted
    description)
    File "C:\Users\vic\Dropbox\Development\Eclipse-juno-workspace\Missale\src\drive.py", line 6, in <module>
    from oauth2client.client import SignedJwtAssertionCredentials
    ImportStringError: import_string() failed for 'illustrations.SyncHandler'. Possible reasons are:

    - missing __init__.py in a package;
    - package or module path not included in sys.path;
    - duplicated package or module name taking precedence in sys.path;
    - missing module, class, function or variable;

    Original exception:

    ImportError: cannot import name SignedJwtAssertionCredentials

    Debugged import:

    - 'illustrations' not found.

    [更新] 回顾我的问题,我想我需要仔细研究一下在本地安装 pycrypto。如果这是修复,我将在 this article 上提供反馈请求添加有关 GAE 服务器运行时库和本地 SDK 库之间差异的注释。我也会在这里添加安装说明。

    [update2] SignedJwtAssertionCredentials 导入问题已经消失,但 tlslite 包出现了另一个导入问题。我不知道如何解决这个问题,因为导入看起来非常正常,我不得不从头开始重新配置整个 IDE。我现在已经安装 another precompiled pycrypto library我按照错误消息中的提示,将我的 .p12 私钥文件转换为 .pem 文件。请注意,由 openssl 创建的 .pem 文件在“-----BEGIN”之前包含 4 个文本行,我必须手动删除这些文本行,以便 oauth2client 识别 .pem 文件!

    [update3] 从头开始​​重新配置 IDE 时,我忽略了使用“old_dev_appserver.py”在本地运行应用程序,而不是“dev_appserver.py”。 The latter will not enable breakpoints!但看起来它与 SignedJwtAssertionCredentials 导入问题有关。使用“dev_appserver.py”,我没有导入问题(但没有断点),使用“old_dev_appserver.py”,我可以重现导入问题。所以“old_dev_appserver.py”可能一直是问题的一部分!

    最佳答案

    是 - 您可以使用 SignedJwtAssertionCredentials 连接到 Google 服务。我编写了一次执行此操作的代码,并且效果很好。使用该类是一个问题。在 GAE 上提供了 PyCrypto 库,就像您编写的那样,但在本地您必须手动安装它。 GAE 有他自己更改的这个库版本,所以他们没有提供她的源代码。该库的第二个问题是她是为将使用她的指定机器编译的。如果您查看该类的源代码,您会发现她需要一些依赖项才能工作。如果他们不符合该类(class)的要求,她将无法从外部代码访问。

    关于在新旧 dev_server 中导入的问题我不能写任何东西,因为我对此一无所知。

    关于google-app-engine - 在 Google Apps Engine python 项目中使用带有服务帐户的 Google Drive API 进行本地调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17158423/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com