如何使用GAE和Python 3从GCS提供大于32 MB的文件

时间:2019-05-28 08:37:45

标签: python-3.x google-app-engine google-cloud-storage google-app-engine-python

我正在通过GAE应用程序(使用flask)从GCS提供一些文件,最近我达到了32 MB的限制。根据文档,应该可以从GCS提供大于32 MB的文件,但是我找不到正确的python3 API。

  

Response limits   动态响应限制为32MB。如果脚本处理程序生成的响应大于此限制,则服务器将发回带有500 Internal Server Error状态代码的空响应。此限制不适用于为Blobstore或Cloud Storage中的数据提供服务的响应。

我已经找到了Blobstore API,该API可以提供来自GCS的文件,但不幸的是该库已弃用,并且不兼容python3。我认为代码就是这种方式的样子

blobstore_filename = '/gs/{}/{}'.format(CLOUD_STORAGE_BUCKET, path)
blob_key = blobstore.create_gs_key(blobstore_filename)

response = Response("This should be overriden by App Enginge")
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['X-AppEngine-BlobKey'] = blob_key
return response

我认为PHP中有一种特定的API方法可以完全满足我的需要 CloudStorageTools#serve

我已经看到一些有关使用Signed URLs的类似问题的建议,但这似乎更像是一种变通方法,而不是实际的问题解决方案。

我原本希望找到一种方法来提供来自GCS的内容,但我不知道我的搜索技能是否使我失望,或者不存在python3环境所需的方法。

2 个答案:

答案 0 :(得分:1)

您可以在您的应用上设置一条路由,以将重定向返回到GCS签名URL。
这样,您可以控制对路线的访问,但是内容本身不由您的应用程序提供。

通过应用提供服务会增加成本并降低性能,因为默认情况下不会动态缓存动态请求,并且AppEngine实例时间和输出数据比从GCS提供服务的成本更高。

具有此功能的App Engine标准环境(例如PHP和Python 2)会在内部进行重定向,因此客户端看不到对GCS的访问,但是发生的情况与此类似。
在Python 3标准see here上没有可用的AppEngine特定API。

要在App Engine标准Python 3上创建签名URL,您需要手动创建服务帐户密钥。 Compute Engine和App Engine上提供的“应用程序默认凭据”不能用于数字签名。 Python 2,Java,Go和PHP允许使用它,因为它们使用内部的App Identity API来生成签名。

尽管这些功能尚不可用,但到目前为止,我所见的Google唯一的评论是:

  

目前,Python 3.7运行时中不提供App Engine API

所以我们仍然会有一些希望。

答案 1 :(得分:0)

有两个选项可以提供文件:

1。-您可以使用断点续传将对象上传到存储桶[1]。只需在初始POST请求中使用签名的URL。

2.-您可以创建策略文档(策略文档定义了用户(具有或不具有Google帐户)可以通过POST表单上传的内容,并提供了授权以确保该表单可以将文件上传到目标存储桶中)并使用常规的HTML表单进行上传[2] [3]。

请让我知道您的想法及其进展。

[1] https://cloud.google.com/storage/docs/access-control/signed-urls#signing-resumable

[2] https://cloud.google.com/storage/docs/xml-api/post-object#policydocument

[3] https://github.com/googleapis/google-cloud-python/issues/2861