惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Jina AI
Jina AI
博客园 - 叶小钗
雷峰网
雷峰网
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
量子位

老董笔记

尚硅谷机构在哪?尚硅谷培训怎么样?靠谱吗-互联网IT百科 韩顺平介绍,传智讲师,开办泰牛,入尚硅谷等一系列-互联网IT百科 pandas多重索引标准样式(写入excel有空行)-互联网IT百科 cannot join with no overlapping index names-互联网IT百科 pandas多列变多行(即宽表变长表)melt和stack函数-互联网IT百科 pandas多行转多列(长表变宽表)pivot和unstack-互联网IT百科 Index contains duplicate entries, cannot reshape完美解决-互联网IT百科 single positional indexer is out-of-bounds-互联网IT百科 Can only compare identically-labeled Series objects-互联网IT百科 pandas transform用法详解(多个案例)-互联网IT百科 python四舍五入精确实现-互联网IT百科 pandas的groupby使用apply分组排序-互联网IT百科 index 0 is out of bounds for axis 0 with size 0-互联网IT百科 pandas分组过滤filter函数-互联网IT百科 联想Win10系统如何禁用触摸屏关闭触摸-互联网IT百科 groupby分组计算transform转换返回相同长度序列-互联网IT百科 brooks seo教程python教程,brooks seo教程网盘,布鲁seo资源-互联网IT百科 电脑右键文件夹一直转圈电卡死怎么回事-互联网IT百科 施琪嘉的心理成长课(荐)-互联网IT百科 百度SEO公司_SEO推广公司哪家好_SEO外包服务如何选-老董笔记 groupby后agg同1列用多个聚合函数、不同列用不同函数、自定义函数-互联网IT百科 pandas的groupby单列多列分组聚合运算-互联网IT百科 DataFrameGroupBy对象及分组个数、分组大小、组名索引、组数据详解-互联网IT百科 pandas中groupby之Grouper and axis must be same length-互联网IT百科 pandas中groupby的分组原理-互联网IT百科 pandas的groupby的使用详解大全-互联网IT百科 openpyxl单元格自动换行强制换行Alignment(wrapText=True)-互联网IT百科 python教程全套(可就业)-互联网IT百科 联想win10系统CPU显示100%,电脑呼呼响怎么回事-互联网IT百科 如何自制CPU,CPU原理是怎么样的?-互联网IT百科
requests上传多个文件及表单信息-互联网IT百科
2021-11-12 · via 老董笔记

  HTTP协议中没有规定post提交数据必须使用什么数据格式,服务端根据请求头中的Content-Type字段来获取提交方式然后对数据进行解析。在html中的form表单中enctype属性有3种设置方式:

 <form action="url地址" enctype="application/x-www-form-urlencoded" method="POST">
<form action="url地址" enctype="multipart/form-data" method="POST"> 上传文件的设置
<form action="url地址" enctype="text/plain" method="POST">

  在form表单中可能会上传多个文件,我们可以写1个简单上传多个文件的界面(丑陋无比):

<form action="https://www.baidu.com/upload.php" enctype="multipart/form-data" method="POST">
<span>账号</span>:<input type="text" name="user" />
<span>密码</span>:<input type="text" name="pwd" />
<input  type="file" name="file1">  <!--选择文件按钮-->
<input  type="file" name="file2">  <!--选择文件按钮-->
<input  type="file" name="file3">  <!--选择文件按钮-->
<input type="submit" />
</form>

  在浏览器上传多个文件需要1个个点击选择提交,在requests中上传多个文件需要把文件信息写到一个由元组的列表中,每个元组就是1个文件信息。 元组的结构为(form_field_name, file_info),form_field_name代表input元素的name属性值,file_info也是1个元组,代表文件信息,一般为文件名、文件路径、文件类型

url = 'http://httpbin.org/post'
multiple_files = [
('file1', ('foo.png', open('foo.png', 'rb'), )),
('file2', ('bar.png', open('bar.png', 'rb'),)),
('file3', ('111.xlsx', open('111.xlsx', 'rb'),)),
]
r = requests.post(url, files=multiple_files)
r.text
# 看请求头
print(r.request.headers)
# 响应头
print('--------')
print(r.headers)
# 返回内容
print(r.text) # 内容太多省略
{'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '15863', 'Content-Type': 'multipart/form-data; boundary=9a8cfa31a7ef4cd551fc5d100d5197ad'}
--------
{'Date': 'Wed, 17 Nov 2021 09:03:41 GMT', 'Content-Type': 'application/json', 'Content-Length': '21334', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}

  上述请求头里有'Content-Type': multipart/form-data代表是上传文件,响应头中'Content-Type': 'application/json'代表返回的内容是json形式,即r.text是json字符串,可自行打印出来查看。

  上面丑陋的图片中,除了上传文件还要填写一些表单信息,如果两者组合起来的一起post的话,那就是files参数和data参数一并使用了,当然也可以加入一些自定义的请求头。

headers = {
'User-Agent':'www.python66.com',
'Referer': 'https://www.hao123.com/'
}
url = 'http://httpbin.org/post'
multiple_files = [
('file1', ('foo.png', open('foo.png', 'rb'), )),
('file2', ('bar.png', open('bar.png', 'rb'),)),
('file3', ('111.xlsx', open('111.xlsx', 'rb'),)),
]
dict_values = {'user':'dong','pwd':123456}
r = requests.post(url, files=multiple_files,data=dict_values,headers=headers)
r.text
# 看请求头
print(r.request.headers)
# 响应头
print('--------')
print(r.headers)
# 返回内容
print(r.text)
{'User-Agent': 'www.python66.com', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Referer': 'https://www.hao123.com/', 'Content-Length': '16042', 'Content-Type': 'multipart/form-data; boundary=80220ce953ec6177b83ffb923cbcaa38'}
--------
{'Date': 'Wed, 17 Nov 2021 09:15:49 GMT', 'Content-Type': 'application/json', 'Content-Length': '21415', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}

  上述代码的响应头中可以看到header参数值都传进去了,如果检查一下r.text的值,会发现账号密码表单信息和文件file1、file2、file3都在。

  PS:强烈建议用二进制模式(binary mode)打开文件,因为requests可能会在header中增加Content-Length字段,该值会被设为文件的字节数,如果用文本模式打开文件,可能碰到错误。

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会