如何使用 GAE 和 Python 3 从 GCS 提供大于 32 MB 的文件
How to serve files larger than 32 MB from GCS using GAE and Python 3
我正在通过 GAE 应用程序(使用烧瓶)从 GCS 提供一些文件,最近我达到了 32 MB 的限制。根据文档,应该可以从 GCS 提供大于 32 MB 的文件,但我找不到正确的 python3 api。
Response limits
Dynamic responses are limited to 32MB. If a script handler generates a response larger than this limit, the server sends back an empty response with a 500 Internal Server Error status code. This limitation does not apply to responses that serve data from the Blobstore or Cloud Storage.
我发现 blobstore 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 环境中不存在我需要的方法。
您可以在您的应用程序上设置一个路由,该路由 returns 重定向到 GCS 签名 URL。
这样您可以控制对路由的访问,但内容本身不是由您的应用程序提供的。
通过您的应用提供服务会增加成本并降低性能,因为默认情况下不会缓存动态请求,而且 AppEngine 实例时间和传出数据比从 GCS 提供服务更昂贵。
具有此功能的 App Engine 标准环境,如 PHP 和 Python 2,会在内部进行此重定向,因此客户端看不到对 GCS 的访问,但情况类似.
None 的 AppEngine 特定 API 可用于 Python 3 标准,see here。
为了在 App Engine 标准 Python 3 上创建签名 URL,您需要手动创建服务帐户密钥。 Compute Engine 和 App Engine 上提供的应用程序默认凭据不能用于数字签名。 Python 2、Java、Go 和 PHP 允许它,因为它们使用内部 App Identity API 来生成签名。
虽然这些还没有,Google到目前为止我看到的唯一评论是:
At this time, App Engine APIs are not available in the Python 3.7 runtime
所以我们还是可以有一点希望的。
提供文件有两个选项:
1.-您可以使用可恢复上传将对象上传到您的 bucket。您只需要在初始 POST 请求中使用已签名的 URL。
2.-You can create a policy document(策略文档定义了用户(有或没有Google帐户)可以使用表单POST上传的内容,并提供授权以确保该表单可以将文件上传到目标存储桶中)并使用常规 HTML 表单来执行 upload.
请告诉我您的想法以及进展情况。
我正在通过 GAE 应用程序(使用烧瓶)从 GCS 提供一些文件,最近我达到了 32 MB 的限制。根据文档,应该可以从 GCS 提供大于 32 MB 的文件,但我找不到正确的 python3 api。
Response limits Dynamic responses are limited to 32MB. If a script handler generates a response larger than this limit, the server sends back an empty response with a 500 Internal Server Error status code. This limitation does not apply to responses that serve data from the Blobstore or Cloud Storage.
我发现 blobstore 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 环境中不存在我需要的方法。
您可以在您的应用程序上设置一个路由,该路由 returns 重定向到 GCS 签名 URL。
这样您可以控制对路由的访问,但内容本身不是由您的应用程序提供的。
通过您的应用提供服务会增加成本并降低性能,因为默认情况下不会缓存动态请求,而且 AppEngine 实例时间和传出数据比从 GCS 提供服务更昂贵。
具有此功能的 App Engine 标准环境,如 PHP 和 Python 2,会在内部进行此重定向,因此客户端看不到对 GCS 的访问,但情况类似.
None 的 AppEngine 特定 API 可用于 Python 3 标准,see here。
为了在 App Engine 标准 Python 3 上创建签名 URL,您需要手动创建服务帐户密钥。 Compute Engine 和 App Engine 上提供的应用程序默认凭据不能用于数字签名。 Python 2、Java、Go 和 PHP 允许它,因为它们使用内部 App Identity API 来生成签名。
虽然这些还没有,Google到目前为止我看到的唯一评论是:
At this time, App Engine APIs are not available in the Python 3.7 runtime
所以我们还是可以有一点希望的。
提供文件有两个选项:
1.-您可以使用可恢复上传将对象上传到您的 bucket。您只需要在初始 POST 请求中使用已签名的 URL。
2.-You can create a policy document(策略文档定义了用户(有或没有Google帐户)可以使用表单POST上传的内容,并提供授权以确保该表单可以将文件上传到目标存储桶中)并使用常规 HTML 表单来执行 upload.
请告诉我您的想法以及进展情况。