zoukankan      html  css  js  c++  java
  • 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中即可

     
    复制请注明出处,在世界中挣扎的灰太狼
  • 相关阅读:
    mysql主从之过滤复制
    mysql主从之主从延时监控及原因分析
    mysql误删搭建有主从的主库master binlog处理
    mysql 主从复制原理,概念,故障的检控/分析/处理
    mysql之主从复制搭建
    mysql表的物理存储结构及逻辑结构
    sql语句执行过程及mysql权限管理
    linux安装mysql5.7.30 及配置多实例
    mysql备份恢复之xtrabackup (XBK、Xbackup)
    mysql 备份之逻辑备份mysqldump, mysqlbinlog, 全备及参数说明
  • 原文地址:https://www.cnblogs.com/XingXiaoMeng/p/14347739.html
Copyright © 2011-2022 走看看