【问题标题】:No module named boto Google Cloud Storage on Django with App Engine在带有 App Engine 的 Django 上没有名为 boto Google Cloud Storage 的模块
【发布时间】:2016-05-22 08:22:09
【问题描述】:

现在我正在我的一个网络项目上设置一个简单的 API 系统,用于写入和读取谷歌云存储(主要用于照片存储),但我在模拟时遇到了一些插件的问题在 App Engine 环境中。

我可能首先解释一下我是如何走到这一步的。最初,我查看了 Google 提供的 cloudstorage API,并尝试使用一个扩展来保存文件:

def _save(self, name, content):
    filename = self.location + "/" + name  # e.g. https://storage.googleapis.com/bucket/name
    filename = os.path.normpath(filename)
    filetype, encoding = mimetypes.guess_type(name)
    gss_file = gcs.open(
        filename,
        mode='w',
        content_type=filetype,
        options={
            'x-goog-acl': 'public-read',
            'cache-control': settings.GOOGLE_CLOUD_STORAGE_DEFAULT_CACHE_CONTROL,
        }
    )
    content.open()
    gss_file.write(content.read())
    content.close()
    gss_file.close()
    return name

使用此代码,我能够实现看似成功的目标。我为POST/PUT 获得了200/201 的HTTP 状态代码,这看起来不错,但进一步看,我发现文件实际上没有正确上传。经过一番修改后,我确定这一定是因为我需要授权才能获得写入权限并且没有提供它们 - 可能我获得成功代码是因为我正在实现响应,这不是我想要的响应(即是的,这个页面存在,但那里没有文件)所以我去寻找一种方法来进行身份验证。

我直接查看了 Google here 提供的 python 教程,但对这个教程一点都不满意。我现在的位置是我已经通过pip 安装了botogcs_oauth2_boto_plugin,并且还从App Engine 中的API Manager Credentials 获得了客户端ID 和客户端密码。尽管在使用以下设置时尝试运行页面:

#!/usr/bin/python

import boto
import gcs_oauth2_boto_plugin


GOOGLE_STORAGE = 'gs'

CLIENT_ID = '(my client id)'
CLIENT_SECRET = '(my client secret)'
gcs_oauth2_boto_plugin.SetFallbackClientIdAndSecret(CLIENT_ID, CLIENT_SECRET)

BUCKET = '(my bucket name)'


def save_blob(directory, name, content):
    dst_uri = boto.storage_uri(BUCKET + '/' + directory + name, GOOGLE_STORAGE)
    dst_uri.new_key().set_contents_from_file(content)
    print 'Successfully created "%s/%s"' % (dst_uri.bucket_name, dst_uri.object_name)

使用上面的代码,在尝试运行我实现它的网页时,我收到以下错误:

ImportError: no module named boto.

过去,当我遇到这种类型的错误时,它是以下几种情况之一:

  1. 我还没有在 pip 上安装模块(我有)
  2. 我还没有将它添加到 app.yaml 的库部分(这会生成错误“无论如何不支持库 boto”)
  3. 我还没有添加到PYTHONPATH(我可以在命令行从Python导入没问题没问题)

我之前尝试将这些模块添加到我的 lib 目录中,但都是一堆未定义的导入,我不确定这是否有必要。我现在要再次尝试这样做,但我不确定这是否是这里的答案。我什至尝试在我的设置中将模块添加到INSTALLED_APPS,但这也没有解决任何问题。我真的有点卡在这里,并会感谢任何人的帮助。谢谢!

编辑:请注意,我正在尝试使用基于 Google here 提供的教程的 XML API。我应该尝试 JSON API 吗?从阅读其他一些 SO 帖子来看,似乎普遍的共识是 JSON API 不允许我在提供额外的后端逻辑方面有那么大的灵活性。这是真的?还是我应该尝试 JSON API?在这一点上,我非常不确定两者之间的区别,因为我无法让它们中的任何一个工作并且没有任何经验。任何额外的信息也很感激。

【问题讨论】:

  • 如果 appengine 应用使用您的 appengine 项目的存储桶,则无需发出授权或签名请求来读取或写入 GCS 对象。您可以使用:cloud.google.com/appengine/docs/python/googlecloudstorageclient/…
  • @voscausa 感谢您的评论。当我从与同一应用程序引擎项目关联的存储桶中提供文件时,这将很有用。但是,我正在运行多个项目,这些项目将在生产环境中相互访问,因此我仍然需要能够通过互操作性进行访问。也许我只需要在主应用程序中执行写入。
  • Cloud Storage JSON API Client Library for Python 是一个很好的选择。 Api 在这里:developers.google.com/resources/api-libraries/documentation/… 和示例在这里:github.com/voscausa/appengine-gcs-acl-insert-delete/blob/master/…
  • 谢谢@voscausa 我现在就开始研究这个,看看我能不能让它工作。即使我浪费时间跑来跑去,我至少也学到了一些东西。
  • 我可以毫无问题地使用它。感谢@voscausa,您非常有帮助地为我指明了正确的方向。我能够使用我在问题中发布的初始代码 sn-p 正确编写。唯一的区别是我从主项目中执行了所有这些,这与持有我的存储桶的项目相同。

标签: python django google-app-engine google-cloud-storage boto


【解决方案1】:

在@voscausa 的帮助下,我尝试了一些我之前尝试过的事情,但这次是在 App Engine 中使用我持有 Cloud Storage 存储桶的主要项目。有了这个,我可以毫无问题地写入文件。我可能会从这里做的只是设置一个 API,我可以从我的其他项目中使用它来通过主项目读取和写入文件,而不是尝试直接从我的其他项目中进行。感谢@voscausa 为我指明了正确的方向!一直以来真的很容易。我想我只是想让自己变得更难。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 2015-04-24
    • 2018-08-05
    • 1970-01-01
    • 2020-01-18
    • 2013-11-02
    • 2021-07-05
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多