• requests库获取图片响应流进行转发


    遇到了一个问题,使用requests进行转发 requests响应流的时候,出现各种问题,问题的描述没有记录,不过Debug以下终于解决了问题。。。。。。。下面简单的描述解决方案

    response = _RequestUtil.post_request_server("upload", data={
                        "blockByteSize": imageBuffer.nbytes,
                        "currentBlockIndex": 0,
                        "id": data["id"]
                    }, files={
                        "multipartFile": imageBuffer
                    })
    表单中的请求参数放到data中,文件数据放到files字典中

    requests的属性files会通过判断几个类型进而决定是否携带数据流

    for field, val in fields:  # 这个for语句决定data字典中的属性
                if isinstance(val, basestring) or not hasattr(val, '__iter__'):
                    val = [val]
                for v in val:
                    if v is not None:
                        # Don't call str() on bytestrings: in Py3 it all goes wrong.
                        if not isinstance(v, bytes):
                            v = str(v)
    
                        new_fields.append(
                            (field.decode('utf-8') if isinstance(field, bytes) else field,
                             v.encode('utf-8') if isinstance(v, str) else v))
    
            for (k, v) in files:  # 这个files决定了你传的files属性的值,进行遍历
                # support for explicit filename
                ft = None
                fh = None
                if isinstance(v, (tuple, list)): # 判断你传的元组的个数,选择不同的行为
                    if len(v) == 2:
                        fn, fp = v
                    elif len(v) == 3:
                        fn, fp, ft = v
                    else:
                        fn, fp, ft, fh = v
                else:
                    fn = guess_filename(v) or k
                    fp = v
    
                if isinstance(fp, (str, bytes, bytearray)):  # 这里是文件对象的关键之处,当files的键对应的值是以下时,会携带上的
                    fdata = fp
                elif hasattr(fp, 'read'): # 这里也就是判断以下对应的值对象是否包含read方法
                    fdata = fp.read()
                elif fp is None:
                    continue
                else:
                    fdata = fp

    
    
           rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) # 最终文件对象会打包成 RequestField 对象
           rf.make_multipart(content_type=ft)

           # new_fields 这个是最终保存所有字段的列表对象
           new_fields.append(rf)
     如有疑问,留言讨论
    复制请注明出处,在世界中挣扎的灰太狼
  • 相关阅读:
    python判断语句和循环语句
    Web项目如何做单元测试
    PHP接口自动化测试框架实现
    引入缺陷的原因都有哪些?
    测试基础:(一)
    测试基础(二)
    测试术语2
    测试术语3
    测试术语4
    Spring Cloud Stream与Spring Cloud Bus区别?
  • 原文地址:https://www.cnblogs.com/XingXiaoMeng/p/14347741.html
Copyright © 2020-2023  润新知