使用 App Engine 的 Django 上没有名为 boto Google Cloud Storage 的模块
No module named boto Google Cloud Storage on Django with App Engine
现在我正在为我的一个 Web 项目设置一个简单的 API 系统,用于写入和读取 Google 云存储(主要用于照片存储),但我还在运行在 App Engine 环境中模拟时遇到一些插件问题。
我可能会首先解释我是如何走到这一步的。最初,我直接查看了 Google 提供的云存储 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
的 HTTP 状态代码为 200
/201
,这看起来不错,但进一步查看后我发现文件实际上没有正确上传。稍作修改后,我确定这一定是因为我需要写权限的授权并且没有提供它们 - 可能我获得成功代码是因为我正在获得响应,但这不是我想要的响应(即是的,这个页面存在,但那里没有文件)所以我一直在寻找一种方法来进行身份验证。
我直接查看了 Google here 提供的 python 教程,但在这方面运气不佳。我现在的位置是我已经通过 pip
安装了 boto
和 gcs_oauth2_boto_plugin
,并且还从 App 中的 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.
过去,当我 运行 遇到这种类型的错误时,它是以下几种情况之一:
- 我还没有在 pip 上安装模块(我有)
- 我还没有将它添加到
app.yaml
中的库部分(无论如何都会产生错误 "library boto is not supported")
- 我还没有将它添加到
PYTHONPATH
(我可以在命令行上从 Python 导入它没问题)
我之前尝试将这些模块添加到我的 lib 目录中,但都是一堆未定义的导入,而且我不确定是否有必要这样做。我现在要再次尝试这样做,但我不确定这是否就是答案。我什至尝试在我的设置中将模块添加到 INSTALLED_APPS
,但这也没有解决任何问题。我真的有点被困在这里,非常感谢任何人对此的帮助。谢谢!
编辑:注意到我正在尝试根据 Google here 提供的教程使用 XML API 可能会有所帮助。我应该尝试 JSON API 吗?通过阅读其他一些 SO 帖子,似乎普遍的共识是 JSON API 不允许我在提供额外的后端逻辑方面有足够的灵活性。这是真的?或者我应该尝试 JSON API?在这一点上,我非常不确定两者之间的区别,因为我无法让他们中的任何一个工作并且没有任何经验。任何额外的信息也将不胜感激。
在@voscausa 的帮助下,我尝试了一些我之前尝试过的事情,但这次是在 App Engine 中使用我持有 Cloud Storage 存储桶的主要项目。这样,我就可以毫无问题地编写文件了。从这里我可能要做的只是设置一个 API,我可以从我的其他项目中使用它来通过主项目读取和写入文件,而不是尝试直接从我的其他项目中执行此操作。感谢@voscausa 为我指明了正确的方向!一直以来真的很容易。我想我只是想让自己变得更难。
现在我正在为我的一个 Web 项目设置一个简单的 API 系统,用于写入和读取 Google 云存储(主要用于照片存储),但我还在运行在 App Engine 环境中模拟时遇到一些插件问题。
我可能会首先解释我是如何走到这一步的。最初,我直接查看了 Google 提供的云存储 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
的 HTTP 状态代码为 200
/201
,这看起来不错,但进一步查看后我发现文件实际上没有正确上传。稍作修改后,我确定这一定是因为我需要写权限的授权并且没有提供它们 - 可能我获得成功代码是因为我正在获得响应,但这不是我想要的响应(即是的,这个页面存在,但那里没有文件)所以我一直在寻找一种方法来进行身份验证。
我直接查看了 Google here 提供的 python 教程,但在这方面运气不佳。我现在的位置是我已经通过 pip
安装了 boto
和 gcs_oauth2_boto_plugin
,并且还从 App 中的 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.
过去,当我 运行 遇到这种类型的错误时,它是以下几种情况之一:
- 我还没有在 pip 上安装模块(我有)
- 我还没有将它添加到
app.yaml
中的库部分(无论如何都会产生错误 "library boto is not supported") - 我还没有将它添加到
PYTHONPATH
(我可以在命令行上从 Python 导入它没问题)
我之前尝试将这些模块添加到我的 lib 目录中,但都是一堆未定义的导入,而且我不确定是否有必要这样做。我现在要再次尝试这样做,但我不确定这是否就是答案。我什至尝试在我的设置中将模块添加到 INSTALLED_APPS
,但这也没有解决任何问题。我真的有点被困在这里,非常感谢任何人对此的帮助。谢谢!
编辑:注意到我正在尝试根据 Google here 提供的教程使用 XML API 可能会有所帮助。我应该尝试 JSON API 吗?通过阅读其他一些 SO 帖子,似乎普遍的共识是 JSON API 不允许我在提供额外的后端逻辑方面有足够的灵活性。这是真的?或者我应该尝试 JSON API?在这一点上,我非常不确定两者之间的区别,因为我无法让他们中的任何一个工作并且没有任何经验。任何额外的信息也将不胜感激。
在@voscausa 的帮助下,我尝试了一些我之前尝试过的事情,但这次是在 App Engine 中使用我持有 Cloud Storage 存储桶的主要项目。这样,我就可以毫无问题地编写文件了。从这里我可能要做的只是设置一个 API,我可以从我的其他项目中使用它来通过主项目读取和写入文件,而不是尝试直接从我的其他项目中执行此操作。感谢@voscausa 为我指明了正确的方向!一直以来真的很容易。我想我只是想让自己变得更难。