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)
rf.make_multipart(content_type=ft)

# new_fields 这个是最终保存所有字段的列表对象
new_fields.append(rf)

 

总结就是,普通字段值放到data中,文件流数据放到files中即可

 
posted @ 2021-03-03 11:16  星小梦  阅读(89)  评论(0编辑  收藏  举报