【问题标题】:GCS delete object using python client doesn't remove the resource using GET uri使用 python 客户端的 GCS 删除对象不会使用 GET uri 删除资源
【发布时间】:2019-01-24 05:22:40
【问题描述】:

使用 GCS python 客户端,删除 blob 不会引发任何异常。但是对刚刚删除的 URI 执行 GET 仍然会返回资源。以下代码是单个文件 Flask 应用程序的一部分。

from google.cloud import storage as gstorage
storage_client = gstorage.Client()
storage_bucket = storage_client.get_bucket(app.config['STORAGE_BUCKET'])
@bp.route('/verify', methods=['POST'])
def post_verification_photo():
    ...
    crs.execute('SELECT uri FROM photo WHERE id=%s', (photoId,))
    photoUri = crs.fetchone()[0]
    storage_bucket.delete_blob(photoUri[photoUri.rindex('/')+1:])

请注意,该对象是使用 Cache-Control: public, max-age=9999999 标头创建的,并且在元数据中公开且不可恢复。

执行后没有报错,但是GET到bucket URI前缀的full URI还是返回了object。我对这些方法的实际使用感到困惑吗?或者 API 是否需要一些时间才能将其从网络中删除?或者,别的什么?

【问题讨论】:

    标签: python google-cloud-storage google-cloud-python


    【解决方案1】:

    您不必将storage 导入为gstorage。您可以按照此Deleting Objects Python 文档进行操作。它还有一个指向 GitHub 的链接,其中包含用于管理 Blobs 的所有功能。

    我自己做了一点编码。你可以看到example code on GitHub here。您使用一个函数列出存储桶中的所有 blob,并使用另一个函数删除其中一个 blob。再次列出 blob 时,您将看到 blob 已成功删除。再次尝试删除相同的 blob 会导致错误提示您找不到该 blob。在您的代码中使用此示例,当您尝试获取 URI 时,您将无法获取对象。

    【讨论】:

    • 感谢您的回答,我的代码看起来很像这样。问题似乎是某些东西正在缓存,因此 GET 仍然返回了该对象。但是直接用gsutils检查确认,已经不在桶里了。
    • 很高兴您解决了您的问题。由于代码执行没有任何错误,那么缓存的东西确实似乎是问题的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2015-09-27
    • 2018-04-20
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多