七牛云Python SDK批量删除资源源码解析
本文深入解析七牛云Python SDK中批量删除资源的实现原理。通过追踪build_batch_delete、entry及batch方法源码,详细阐述从空间名与文件名拼接、Base64编码到生成操作指令,最终通过HTTP POST请求发送至rs.qiniu.com接口的完整流程。
七牛云Python SDK批量删除源码解析
在近期项目中使用了七牛云存储,资源管理逻辑部署在后端,并调用其提供的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)
#初始化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文件中。
查看bucket.py文件内容。
build_batch_delete函数实现
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方法数据格式处理
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文件相关部分。
_build_op操作指令生成
def _build_op(*args): 这里 出入args 为("delete",'ZGRkZDpkZGRfMzMubXA0' )
return '/'.join(args) # join 操作以后 为 "delete/ZGRkZDpkZGRfMzMubXA0"
至此,build_batch_delete方法的执行逻辑结束。结合前述示例,该方法最终返回一个列表,元素格式为["delete/ZGRkZDpkZGRfMzMubXA0", ...],其中包含多个经过处理的删除指令字符串。
随后分析bucket.batch(ops)方法的实现细节。
batch方法请求构建与发送
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', ...]},将操作指令封装在字典中。
接着,代码发起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)
在该文件中,对响应体进行了单独处理。因此,最终返回的是一个元组,调用者可以使用两个参数分别接收解析后的结果数据和响应信息对象。
以上是对七牛云Python SDK中删除操作源码的完整分析,如有疏漏或错误,欢迎指正。
本文介绍了基于Python SDK批量删除七牛云资源的操作方法及源码解析,更多相关内容可查阅本站过往文章或继续浏览后续更新,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













