通常提交普通表单时,requests的post方法可以指定headers,所以我在使用requests模拟上传文件行为时,直接按照下面的方式写了:

然后服务器就报出了找不到分隔符Invalid multipart/form-data: multipart boundary not found

网上找了半天也没找到为什么,倒是大家给的示例比我写的少用了一个headers,尝试着调整了一下,去掉headers参数就可以上传了,我怀疑时requests内部会检查用户是否已经定义了headers,如果定义了,则直接使用,否则requests根据其他参数自动给生成headers。

所以我想,如果是这样,那我再headers里把需要的内容都写上,应该也是可以的,上面提示未找到boundary,那么我自己写上boundary(http协议允许用户自定义boundary):

定义了boundary,但是服务器却报出没有final boundary,我们知道,post编码时,发送前会用boundary分割不同字段,最后以前后都有--的boundary结束。所以,出现找不到final boundary应该就是自定义的boundary没有起到作用,去看源代码吧。

翻出requests源代码,在models.py文件里,函数就是对post字段进行编码的,对于上传文件来讲,content_type来自函数;最终通过生成boundary,拼接出模块内的content_type。

如果用户没有自定义content-type,那么就使用模块内自己随机生成的boundary。但是返回到prepare_body里,最后会判断用户是否定义了Content-type,如果定义了则使用用户定义好的,相关代码如下:

所以,从这里可以看出,无论用户怎么定义Content-type,实际用到的boundary还是模块自己生成的,而且一旦用户自定义了content-type,最终post请求的headers里携带的boundary跟实际编码用到的boundary就会不一致,导致服务器端无法解析。

总结为一句话:使用requests的post方法上传文件时,不能自定义headers里的content-type。

python requests 上传文件_python3使用requests上传文件,content-type踩的坑的更多相关文章

  1. drupal7 开发自定义上传、下载模块的上传功能

    关键点有两个:1.在页面上显示出上传的控件,2.代码实现文件上传到服务器的功能 一.显示控件: 先来看关键点1: 实现页面显示出上传控件, 关键代码: $form['my_file_field'] = ...

  2. 用python做的windows和linx文件夹同步。解决自动同步、加快传输大量小文件的速度、更丰富的文件上传过滤设置。

    现在工具不好用,用的pycharm自动同步,但对于git拉下来的新文件不能自动上传到linux,只有自己编辑过或者手动ctrl + s的文件才会自动同步.导致为了不遗漏文件,经常需要全量上传,速度非常 ...

  3. 【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess

    json & pickle Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] ...

  4. Python爬虫系列(三):requests高级耍法

    昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知.学会上一课程,我们已经能写点基本的爬虫了.但是还不够,因为,很多站点是需要登录的,在站点的各个请求之间,是需要保持回话状态的 ...

  5. python之爬虫(四)之 Requests库的基本使用

    什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...

  6. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  7. jmert中如何测试上传文件接口(测试上传excel文件)

    第一次用jmeter这个工具测试上传接口,以前没做过这一块,导致走了很多弯路.特地把经验谢谢,怕自己以后忘记... 一,jmeter如何上传文件 jmeter 的 http requests post ...

  8. js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

    ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId ...

  9. 【转】Python编程: 多个PDF文件合并以及网页上自动下载PDF文件

    1. 多个PDF文件合并1.1 需求描述有时候,我们下载了多个PDF文件, 但希望能把它们合并成一个PDF文件.例如:你下载的数个PDF文件资料或者电子发票,你可以使用python程序合并成一个PDF ...

  10. Github使用.gitignore文件忽略不必要上传的文件 (转)

    原文地址: https://blog.csdn.net/gjy211/article/details/51607347 常用编程语言及各种框架平台下的通用   .gitignore   文件 http ...

随机推荐

  1. QSlider CSS样式

    QSlider::groove:horizontal{ border:0px; height:15px; background:#deffe5; } QSlider::sub-page:horizon ...

  2. holiday08

    第八天 管道 linux允许将 一个命令的输出 可以 通过管道 作为 另一个命令的输入 ls -lh | more 可以理解现实生活中的管子,管子一头塞东西进去,另一头取出来,这里 | 的左右分为两端 ...

  3. [2007年NOIP普及组] Hanoi双塔问题

    给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将 这些国盘移到C柱上,在移动过 ...

  4. Qt实现带有映射关系的进度条

    1.编写继承自widget的新类,这里我们定义为colorWidget; 2.在colorWidget中添加私有变量QVector<QRect> m_rects,用于存放进度条的不同区间( ...

  5. Linux-非Root用户-配置深度学习环境

    1|01 简介 Anaconda:是一个开源的Python发行版本,其包含了conda.Python等软件包,numpy,pandas,scipy等科学计算包. Conda:包管理器, venv+pi ...

  6. 【python】python3.7与3.9共存,两个3版本同时存在(平时用vscode敲代码)pip复制

    1.按照安装python及环境配置 - 人间寒梅 - 博客园 (cnblogs.com),将3.9装好. 2.在官网下载3.7的对应文件 3.下载后运行,并自定义下载且选中添加到path.,自己为py ...

  7. C语言——函数

    C 语言中的函数定义形式: return_type function_name( parameter list ) //函数头 { //函数体 body of the function } 返回类型: ...

  8. ubuntu | virtualbox报错:不能为虚拟电脑打开一个新任务

    百度了几个办法 都不行. 还得是gxd,说在vmware虚拟机设置勾上这个就行了

  9. PLC入门笔记8

    梯形图基础电路 起保停电路 多点起保停电路 互锁控制电路 周期闪烁电路 这应该是等价的!! 定时器的接力电路 同 延时接通,延时断开电路 同 保持信号变脉冲信号电路 定时器TON 接通延时变断开延时电 ...

  10. BGP反射器

    路由反射器是一种减少自治系统内IBGP对等体连接数量的方法. 根据BGP路由通告原则,要求一个AS内的所有BGP Speaker将建立全连接关系(BGP Speaker两两建立邻接关系).当AS内的B ...