【问题标题】:How to serve files larger than 32 MB from GCS using GAE and Python 3如何使用 GAE 和 Python 3 从 GCS 提供大于 32 MB 的文件
【发布时间】:2019-10-13 17:49:23
【问题描述】:

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

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

我找到了可以从 GCS 提供文件的 blobstore API,但不幸的是,该库已弃用且不兼容 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 环境中不存在。

【问题讨论】:

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


    【解决方案1】:

    提供文件有两种选择:

    1.-您可以使用可恢复上传将对象上传到您的bucket。您只需在初始 POST 请求中使用签名 URL。

    2.-您可以创建策略文档(策略文档定义用户(有或没有Google帐户)可以使用表单POST上传什么,并提供授权以确保表单可以将文件上传到目标存储桶)并使用常规 HTML 表单执行upload

    请让我知道您的想法以及进展情况。

    【讨论】:

    • 我真的只对提供存储桶中已有的文件感兴趣,所以 GET 而不是 POST
    • 非常感谢您的澄清。本文档 [1] 讨论了从存储桶中获取对象。您可以查看它以验证这是否是您需要的,您也可以使用 HTML 表单进行下载。 [1]cloud.google.com/storage/docs/xml-api/get-object-download
    【解决方案2】:

    您可以在您的应用程序上设置一个路由,该路由返回到 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 来生成签名。

    虽然这些还没有,但到目前为止我看到的谷歌对此的唯一评论是:

    目前,App Engine API 在 Python 3.7 运行时中不可用

    所以我们还是有希望的。

    【讨论】:

    • 我决定尝试使用签名的 url 方法,代码看起来相当简单。 ' # 创建云存储客户端。 gcs = storage.Client() bucket = gcs.get_bucket(CLOUD_STORAGE_BUCKET) blob = bucket.get_blob(path) url = blob.generate_signed_url(int(time.time() + 10)) return redirect(url) '
    • 这个导致错误的人>AttributeError:你需要一个私钥来签署凭证。你当前使用的凭证 只包含一个令牌.有关详细信息,请参阅google-cloud-python.readthedocs.io/en/latest/core/…。但是它显然是作为服务帐户运行的吗?从我在网上找到的示例中,我在 GAE 上运行时不需要提供更多内容。我错过了什么?
    • 文档说它不适用于 Compute Engine(但适用于 App Engine)这一事实让我有点担心它说 在错误消息中。
    • 应用程序默认凭据不能用于数字签名。由于 App Identity API,某些语言的 App Engine 标准是可能的。您需要使用手动管理的服务帐户密钥在 Python 3 上创建签名 url。我将此添加到答案中,以防有人尝试相同的事情。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2011-10-09
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多