七牛雲的 python sdk 是如何 批量刪除資源的

許光宗發表於2021-10-15

今天做專案的時候用到七牛雲,關於對資源的操作是在後端做的,用的SDK,但是,在網上沒找到詳細的解析,官方文件也沒有太詳細的解說,所以無奈只好看下原始碼

這裡做一下簡單的記錄

from qiniu import build_batch_delete, Auth, BucketManager


#需要填寫你的 Access Key 和 Secret Key,這個在你的個人中心裡有
access_key = 'Access_Key'
secret_key = 'Secret_Key'


#構建鑑權物件
q = Auth(access_key, secret_key)

#初始化BucketManager

bucket = BucketManager(q)

# 這裡就是你的七牛雲裡的空間名稱
bucket_name = "test"# 例子, 檔名 陣列
keys = ['test.mp4','test1.mp4', ''test2.mp4'', ''test3.mp4'']

ops = build_batch_delete(bucket_name, keys)

ret, info = bucket.batch(ops)
print(info)

以上就是批量刪除的全部程式碼,下面做一下詳細的解說

從  build_batch_delete  函式進去,進入bucket.py檔案下的    build_batch_delete 方法裡

 

 

 

bucket.py

def build_batch_delete(bucket, keys):   # 這裡的 bucket 就是上文的bucket_name 空間名稱,keys 及時檔案列表
    return _one_key_batch('delete', bucket, keys)


def _one_key_batch(operation, bucket, keys):   # 這裡給了個預設引數 delete 刪除操作,
return [_build_op(operation, entry(bucket, key)) for key in keys]


下面我們看看 entry 方法裡做了什麼

utils.py

entry  方法 在utils.py檔案裡
def entry(bucket, key):
"""計算七牛API中的資料格式:

entry規格參考 https://developer.qiniu.com/kodo/api/1276/data-format

Args:
bucket: 待操作的空間名
key: 待操作的檔名

Returns:
符合七牛API規格的資料格式
"""
if key is None:
return urlsafe_base64_encode('{0}'.format(bucket))
else:
return urlsafe_base64_encode('{0}:{1}'.format(bucket, key))
如果key 不存在 資料就是空間名,key存在就做了個字串格式化
例如:第一個key 是 test.mp4 那麼 資料就是 "test:test.mp4"
然後將 "test:test.mp4" 傳入 urlsafe_base64_encode 我們再看看 urlsafe_base64_encode 做了什麼






from base64 import urlsafe_b64encode
def urlsafe_base64_encode(data):
"""urlsafe的base64編碼:

對提供的資料進行urlsafe的base64編碼。規格參考:
https://developer.qiniu.com/kodo/manual/1231/appendix#1

Args:
data: 待編碼的資料,一般為字串

Returns:
編碼後的字串
"""
ret = urlsafe_b64encode(b(data))
return s(ret)

返回的資料是 bytes 型別 又傳到s方法裡做了一遍解碼 為字串型別



compat.py

 def b(data):
        if isinstance(data, str):
            return data.encode('utf-8')
        return data

最後data 被傳入 b方法 做了一下utf-8 編碼

def s(data):
if isinstance(data, bytes):
data = data.decode('utf-8')
return data




最後     entry  函式  返回的 是  'ZGRkZDpkZGRfMzMubXA0' 型別資料  結合上文    我們再看看    _build_op  方法做了什麼

bucket.py

def _build_op(*args):  這裡 出入args 為("delete",'ZGRkZDpkZGRfMzMubXA0' )
    return '/'.join(args)   # join  操作以後  為   "delete/ZGRkZDpkZGRfMzMubXA0"


 

到這   build_batch_delete  方法就執行完了  結合上面示例,該方法  返回的是一個列表  ["delete/ZGRkZDpkZGRfMzMubXA0","delete/ZGRkZDpkZGRfMzMubXA0","delete/ZGRkZDpkZGRfMzMubXA0","delete/ZGRkZDpkZGRfMzMubXA0" ]

 

然後  再看     bucket.batch(ops)  裡 做了 什麼

    def batch(self, operations):
        """批量操作:

        在單次請求中進行多個資源管理操作,具體規格參考:
        http://developer.qiniu.com/docs/v6/api/reference/rs/batch.html

        Args:
            operations: 資源管理運算元組,可通過

        Returns:
            一個dict變數,返回結果類似:
                [
                    { "code": <HttpCode int>, "data": <Data> },
                    { "code": <HttpCode int> },
                    { "code": <HttpCode int> },
                    { "code": <HttpCode int> },
                    { "code": <HttpCode int>, "data": { "error": "<ErrorMessage string>" } },
                    ...
                ]
            一個ResponseInfo物件
        """
        url = '{0}/batch'.format(config.get_default('default_rs_host'))   
        return self.__post(url, dict(op=operations))

config.py

RS_HOST = 'http://rs.qiniu.com'  # 管理操作Host
RSF_HOST = 'http://rsf.qbox.me'  # 列舉操作Host
API_HOST = 'http://api.qiniu.com'  # 資料處理操作Host
UC_HOST = 'https://uc.qbox.me'  # 獲取空間資訊Host

_BLOCK_SIZE = 1024 * 1024 * 4  # 斷點續傳分塊大小,該引數為介面規格,暫不支援修改

_config = {
    'default_zone': zone.Zone(),
    'default_rs_host': RS_HOST,
    'default_rsf_host': RSF_HOST,
    'default_api_host': API_HOST,
    'default_uc_host': UC_HOST,
    'connection_timeout': 30,  # 連結超時為時間為30s
    'connection_retries': 3,  # 連結重試次數為3次
    'connection_pool': 10,  # 連結池個數為10
    'default_upload_threshold': 2 * _BLOCK_SIZE  # put_file上傳方式的臨界預設值
}

 

從  配置檔案裡 取出跟路徑 做拼接

得 URL =  http://rs.qiniu.com/batch

 

 

dict(op=operations)  得   {'op': ['delete/ZGRkZDpkZGRfMzMubXA0', 'delete/ZGRkZDpkZGRfMzMubXA0', 'delete/ZGRkZDpkZGRfMzMubXA0', 'delete/ZGRkZDpkZGRfMzMubXA0']}

 

再然後就是 調post請求  將刪除請求 和 資料發過去

 

最後返回值  得提一下  

http.py

def __return_wrapper(resp):
    if resp.status_code != 200 or resp.headers.get('X-Reqid') is None:
        return None, ResponseInfo(resp)
    resp.encoding = 'utf-8'
    ret = resp.json() if resp.text != '' else {}
    if ret is None:  # json null
        ret = {}
    return ret, ResponseInfo(resp)

在這個檔案裡   還單獨處理了一下 響應體 所以最後返回的是一個元祖,可以用兩個引數接受

 

 

以上就是對  七牛雲  這個刪除 操作 做的一個原始碼分析,,有不對的地方請大佬指出。

 

相關文章