如何使用app engine SDK提供cloudstorage文件

时间:2014-03-04 14:37:25

标签: python google-app-engine sdk google-cloud-storage serving

在app引擎中,我可以使用我的应用程序的默认存储桶来提供像pdf这样的cloudstorage文件:

http://storage.googleapis.com/<appid>.appspot.com/<file_name>

但是如何在不使用blob_key的情况下在SDK中提供本地cloudstorage文件?

我写这样的默认存储桶:

gcs_file_name = '/%s/%s' % (app_identity.get_default_gcs_bucket_name(), file_name)
with gcs.open(gcs_file_name, 'w') as f:
    f.write(data)

SDK ='app_default_bucket'

中默认存储桶的名称

在SDK数据存储区中,我有一种: GsFileInfo 显示:filename:/app_default_bucket/example.pdf

更新和解决方法:您可以获取非图像文件(如css,js和pdf)的服务网址。

gs_file = '/gs/%s/%s/%s' % (app_identity.get_default_gcs_bucket_name(), folder, filename)
serving_url = images.get_serving_url(blobstore.create_gs_key(gs_file))

3 个答案:

答案 0 :(得分:11)

更新我发现此功能使用SDK提供云存储文件:

This feature has not been documented yet.

http://localhost:8080/_ah/gcs/app_default_bucket/filename

这样我们不需要img服务网址来提供NON图像,如下所示!!!

要在default_bucket中为图像,css,js和pdf等云存储文件创建e服务URL,我使用此代码进行测试(SDK)和GAE生成:

重要提示:images.get_serving_url()也适用于SDK中的NON图像!!

在SDK中,您需要使用blobstore读取blob并为cloudstorage对象创建服务URL。

我还在SDK和GAE制作中添加了读取,写入和上传cloudstorage blob的代码。

可以找到代码here

答案 1 :(得分:4)

这是您在app_identity_stub.py的开发模式中看到的值:

APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket'

此文件中的注释解释了它:

  

此服务与生产服务的行为相同,但使用除外   常量值而不是特定于应用的值

您应该在生产代码中获得正确的网址。

编辑:

这是来自支持论坛:

  

在开发模式下,应用引擎工具会模拟Google Cloud   本地存储服务。该模拟环境中的对象是   非持久性因此您的应用程序失败,因为所需的对象   在本地商店中不存在。如果您首先创建(并且可选)   写到你想要阅读的对象,它应该在dev中工作正常   模式(它为我做了)。当然,生产服务中的对象是   执行所以在运行你的时候不需要额外的步骤   应用程序处于生产模式(假设对象已存在)。

     

希望有所帮助,

     

Marc Google云存储小组

这意味着您必须先写一个文件,然后才能使用它。如果我理解正确,您可以使用任何存储桶名称,包括'app_default_bucket'。

答案 2 :(得分:0)

我之前在这里寻找答案,只是想分享我发现的东西,现在我已经有了它。

现在可以这样做,而且只是有点痛苦。欺骗图像或blobstore API不受支持,似乎不再有效。

请参阅:

如果您对自己的网址进行了签名,则可以为自己的内容提供自动过期的链接,以供匿名或付费使用。您不希望以这种方式为整个网站提供服务,但对于PDF或诸如此类的东西,这是一个有效且半安全的选项。

缺少文档,您可能需要删除规范扩展标头的换行符。存储端点将告诉您签名错误时的预期结果。

此外,您的主机应为:https://storage-download.googleapis.com/

如果您正在使用App Engine,则GoogleAccessId为:&lt; projectname&gt; @ appspot.gserviceaccount.com

请参阅:app_identity.get_service_account_name()

如何生成签名的示例:

from google.appengine.api import app_identity


def signFile(path, verb='GET', md5='', contentType='',
             expiration=''):
    signatureRequest = '{}\n{}\n{}\n{}\n{}'.format(
        verb, md5, contentType, expiration, path)

    return app_identity.sign_blob(signatureRequest)

返回(privateKey, binarySignature)的元组。

现在您需要构建URL。签名应该是base64编码,然后是urlencoded。有关如何完成URL的构建,请参阅以下内容。您应该可能使用上面提到的下载主机。

来自文档的示例网址:

https://storage.googleapis.
com/example-bucket/cat.jpeg?GoogleAccessId=example@example-project.iam.gservicea
ccount.com&Expires=1458238630&Signature=VVUgfqviDCov%2B%2BKnmVOkwBR2olSbId51kSib
uQeiH8ucGFyOfAVbH5J%2B5V0gDYIioO2dDGH9Fsj6YdwxWv65HE71VEOEsVPuS8CVb%2BVeeIzmEe8z
7X7o1d%2BcWbPEo4exILQbj3ROM3T2OrkNBU9sbHq0mLbDMhiiQZ3xCaiCQdsrMEdYVvAFggPuPq%2FE
QyQZmyJK3ty%2Bmr7kAFW16I9pD11jfBSD1XXjKTJzgd%2FMGSde4Va4J1RtHoX7r5i7YR7Mvf%2Fb17
zlAuGlzVUf%2FzmhLPqtfKinVrcqdlmamMcmLoW8eLG%2B1yYW%2F7tlS2hvqSfCW8eMUUjiHiSWgZLE
VIG4Lw%3D%3D

我希望这有助于某人!

哦,是的,如果您的存储桶无法公开访问(全部阅读),您只需要执行所有签名工作。