今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的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. React 性能调优记录(下篇),如何写高性能的代码

    react性能非常重要,性能优化可以说是衡量一个react程序员水平的重要标准. 减少你的渲染 这个大家都明白,只要是父组件中用了子组件,子组件就算没用prop也会进行依次渲染, 可以用pureCom ...

  2. Redis(一):安装

    Ubuntu中使用yum安装redis: sudo apt-get install redis-server # 安装redis,安装完成后会自动启动 ps aux|grep redis # 查看进程 ...

  3. SpringBoot笔记(4)

    一.请求处理 1.1 常用参数注解使用 注解 使用 @PathVariable 获取URI模板指定请求,并赋值到变量中,不指定可以将所有请求放到map中,但是健值都为String @RequestHe ...

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

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

  5. 整理之Fragment

    基础 生命周期 执行层次 进 退 创建与销毁 onAttach -> onCreate -> onCreateView -> onActivityCreate onDestroyVi ...

  6. docker数据卷(Data Volumes)

    Docker宿主机和容器之间文件拷贝docker copy 前言: Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享,这必然涉及 ...

  7. JS_DOM操作之绑定事件

    1 - 静态绑定:直接把事件写在标签元素中 <div id="div" onclick="foo(this)">click</div> ...

  8. python glob.glob()

    glob()函数可以将某目录下所有跟通配符模式相同的文件放到一个列表中,有了这个函数,我们再想生成所有文件的列表就不需要使用for循环遍历目录了,直接使用glob.glob(path+pattern) ...

  9. CSS002. 字体穿透蒙层(用img设置字体的color)

    之前在逛Apple Store时看到了下面的UI: 交互图标非常圆滑上手也很舒服,虽然背景底色本就是白底,但是只依赖css能不能使  "+" 穿透背景看到底色 ? 大致思路如下: ...

  10. session案例之验证码

    一.需求分析 其中,一张图片就是一个单独的请求: 一个验证验证码的Servlet,还有一个验证用户名和密码的Servlet,两次都可能有错误信息返回到前端页面,所以前面页面要从request域中获取返 ...