今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的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)

在这个文件里   还单独处理了一下 响应体 所以最后返回的是一个元祖,可以用两个参数接受

以上就是对  七牛云  这个删除 操作 做的一个源码分析,,有不对的地方请大佬指出。

七牛云的 python sdk 是如何 批量删除资源的的更多相关文章

  1. 七牛云存储Python SDK使用教程 - 上传策略详解

    文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k  ...

  2. Python小练习:批量删除多个文件夹内的相同文件

    应用场景: 下载的多个文件夹是压缩包,解压后每个文件夹都有某个网站的推广链接,想要批量的删除该文件 使用环境:win7,python3.6 代码: 1.直接用for循环 由于os.walk()方法自带 ...

  3. 七牛云数据存储Demo

    利用七牛云的Python SDK实现文件上传.下载等操作. import os import requests import qiniu from qiniu import BucketManager ...

  4. 基于七牛Python SDK写的一个同步脚本

    需求背景 最近刚搭了个markdown静态博客,想把博客的图片放到云存储中. 经过调研觉得七牛可以满足我个人的需求,就选它了. 博客要引用图片就要先将图片上传到云上. 虽然七牛网站后台可以上传文件,但 ...

  5. 开发者选择短视频SDK,为何青睐七牛云?

    从文字到图片再到视频的互联网内容媒介发展途径,随着 5g 技术的逐渐落地愈发清晰.短视频市场中的角力也随着诸多资本和创业者的涌入,进入到白热化阶段.这样的情况下,选择合适的短视频SDK产品就显得尤为重 ...

  6. php七牛批量删除空间内的所有文件方法

    相信大家都在使用七牛的免费云存储服务的同时,有清空七牛云存储镜像文件或者批量删除七牛云空间文件的需求,该怎么做?官方的工具好像并没有提供批量删除的功能,七牛云官方给出的建议是删除空间,再新建一个这样太 ...

  7. 七牛云存储官方接口PHP版本

    PHP SDKv6 此 SDK 适用于 PHP 5.1.0 及其以上版本.基于 七牛云存储官方API 构建.使用此 SDK 构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云存储上. ...

  8. 如何利用”七牛云”在UEditor实现图片的上传和浏览

    在学习之前,我参考了朋友些的一篇关于这个功能实现的文章,非常不错.大家可以参考:http://www.cnblogs.com/John-Marnoon/p/5818528.html#3501846 里 ...

  9. 架构师小跟班:教你从零开始申请和配置七牛云免费OSS对象存储(不能再详细了)

    背景 之前为了练习Linux系统使用,在阿里云上低价买了一台服务器(网站首页有活动链接,传送门),心里想反正闲着也是闲着,就放了一个网站上去.现在随着数据越来越多,服务器空间越来越吃紧,我就考虑使用七 ...

随机推荐

  1. 了解Prometheus

    了解Prometheus 标签(空格分隔): 监控 介绍 Prometheus是用来收集和存储服务器的实时数据(比如:CPU.硬盘.服务响应.日志等),通过其丰富的运算函数,可以计算得到很多的服务性能 ...

  2. deepin-terminal改造风云再起

    1. 创作背景 使用deepin-terminal的时候,我发现一些小的问题. 在论坛的帖子(https://bbs.deepin.org/zh/post/224502)也总结反馈了这些问题 终端标签 ...

  3. spring动态切换数据源(一)

    介绍下spring数据源连接的源码类:| 1 spring动态切换连接池需要类AbstractRoutingDataSource的源码 2 /* 3 * Copyright 2002-2017 the ...

  4. ES6两种静态属性的书写方法

    1.这种可以不用实例化对象就能输出. class Car{ constructor(){ } } Car.tool=4 console.log(Car.tool);//4 2.必须实例化后才能输出.但 ...

  5. linux centos7 定时执行服务监控脚本

    2021-08-25 1. 需求 在服务挂掉之后我们要怎么做才能保证服务在短时间内开启?可以编写脚本监控服务的状态,在服务挂掉后及时将其开启,并定时执行该脚本. 2. 脚本编写 思路:平常我们可以通过 ...

  6. MySQL——InnoDB事务

    事务:全部成功 或 全部失败! ------------------------------------------------------------------------------------ ...

  7. openswan专栏序言

    openswan专栏序言 "一杯茶,一包烟,一个bug解一天!!!". ​ 2020年春季,正值新冠病毒在全球肆虐之际,美国的疫情已经相当的严峻,每天仍以3万速度狂奔.而国内的疫情 ...

  8. salesforce零基础学习(一百零六)Dynamic Form

    本篇参考:https://trailblazer.salesforce.com/ideaview?id=08730000000BroxAAC https://help.salesforce.com/s ...

  9. Spring5(六)——AspectJ(xml)

    一.AspectJ 1.介绍 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,也可以说 AspectJ 是一个基于 Java 语言的 AOP 框架.通常我们在 ...

  10. 使用Python来临时启动端口,用来做安全时候的扫描用

    root用户:mkdir /home/aicccd /home/aicc/nohup python -m SimpleHTTPServer 8060 &netstat -antp|grep 8 ...