今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码
这里做一下简单的记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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
1
2
|
def build_batch_delete(bucket, keys): # 这里的 bucket 就是上文的bucket_name 空间名称,keys 及时文件列表 return _one_key_batch( 'delete' , bucket, keys) |
1
2
|
def _one_key_batch(operation, bucket, keys): # 这里给了个默认参数 delete 删除操作, return [_build_op(operation, entry(bucket, key)) for key in keys] |
下面我们看看 entry 方法里做了什么
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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
1
2
3
4
5
6
7
8
9
10
11
|
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
1
2
|
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) 里 做了 什么
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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
1
2
3
4
5
6
7
8
|
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 是如何 批量删除资源的内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/xuguangzong/p/15412283.html