首页 > 解决方案 > 提取 gcloud/digitalocean url 数据以进行签名的改进方法

问题描述

我有一个 python 实用函数,它给出了一个来自 gcp 或 digitalocean 的私有 url,使用 boto3 库对其进行签名。

要签署一个 url,我首先需要知道 urlsbucket_idobject_idbucket region,目前我正在使用正则表达式提取它们。为了解析 gcp 和 digitalocean url,我创建了两个单独的正则表达式,并根据 url 使用两者之一。

我的私人网址具有以下结构:

现在,我的方法有效,类似于下面的伪代码:

def sign_url(url):
  if "digitaloceanspaces.com" in url:
    bucket, region, endpoint, object_id = extract_do_data(url) # <- using do regex
  elif "storage.googleapis.com" in url:
    bucket, region, endpoint, object_id = extract_google_data(url) # <- using gcp regex
  else:
    raise ApiError(f"url data extraction failed for unrecognized url {url}")

  [...]

  client = boto3.Session().client(
    region_name=region,
    endpoint_url=endpoint,
    ...
  )

  signed_url = client.generate_presigned_url(
    ClientMethod="get_object",
    Params={"Bucket": bucket, "Key": object_id},
  )

  return signed_url

我正在寻找的是具有通用功能,最好来自内置的python库或boto3,它足够通用,可以让我始终能够从任何输入url中提取和存储bucket_id,而不管结构如何。重要的是足够通用,如果有一天我需要从新服务签署 url,或者 url 采用不同的结构(我相信 gcp url 也可以传递为,这将需要一个新的正则表达式),我仍然可以提取我的元素而无需更改。object_idregionhttps://bucket_id.storage.googleapis.com/object_id

标签: pythonboto3

解决方案


推荐阅读