七牛云的python|七牛云的python sdk 批量删除资源的操作方法

今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的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)#初始化BucketManagerbucket = 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
def entry(bucket, key):"""计算七牛API中的数据格式:entry规格参考 https://developer.qiniu.com/kodo/api/1276/data-formatArgs: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_b64encodedef urlsafe_base64_encode(data):"""urlsafe的base64编码:对提供的数据进行urlsafe的base64编码。规格参考:https://developer.qiniu.com/kodo/manual/1231/appendix#1Args: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 = https://www.it610.com/article/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.htmlArgs:operations: 资源管理操作数组,可通过Returns:一个dict变量,返回结果类似:[{ "code": , "data": },{ "code":},{ "code":},{ "code":},{ "code": , "data": { "error": "" } },...]一个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'# 管理操作HostRSF_HOST = 'http://rsf.qbox.me'# 列举操作HostAPI_HOST = 'http://api.qiniu.com'# 数据处理操作HostUC_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请求 将删除请求 和 数据发过去
【七牛云的python|七牛云的python sdk 批量删除资源的操作方法】最后返回值 得提一下
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 nullret = {}return ret, ResponseInfo(resp)

在这个文件里 还单独处理了一下 响应体 所以最后返回的是一个元祖,可以用两个参数接受
以上就是对 七牛云 这个删除 操作 做的一个源码分析,,有不对的地方请大佬指出。
到此这篇关于python sdk 批量删除资源的操作方法的文章就介绍到这了,更多相关python sdk 是如何 批量删除资源的内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读