• 七牛云的 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)
    
    #初始化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)

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

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

  • 相关阅读:
    day39
    day36
    day35
    day34
    深入理解css的margin
    git使用
    java常见的分页实现方式
    jquery常识
    与border不得不说的故事
    测试效果
  • 原文地址:https://www.cnblogs.com/xuguangzong/p/15412283.html
Copyright © 2020-2023  润新知