记录python上传文件的坑(2)
描述:
1、之前在写项目mock代码时,碰到一个上传文件的接口,但项目接口本身有token保护机制,碰到token失效时,需要重新获取一次token后,再次对上传文件发起请求,在实际调用中发现,第一次调用上传接口能正常返回,但第二次获取新token再调用上传文件接口时,一直无返回数据,直到超时报错
有问题的代码如下:
from requests_toolbelt import MultipartEncoder
import requests m = MultipartEncoder(fields={'upload': open('test.txt', 'rb')},
boundary='----WebKitFormBoundarytZTJQrWcjjcJIMVQ')
params = {'path': 'test.txt',
'token': '',
'num': 0, 'offset': 0,
'limit': 8}
response = requests.post('http://httpbin.org/post',
params=params,
data=m,
headers={'Content-Type': m.content_type})
# print("1: ", response.text)
# print("2: ", response.request.body)
# print("3: ", response.request.headers) print(2)
response1 = requests.post('http://httpbin.org/post',
params=params,
data=m,
headers={'Content-Type': m.content_type})
2、后面通过fiddler抓包发现,在第二次请求上传接口时,body丢失了,通过debug定位,发现第二次请求在调用requests库时,body中是有值的,当进入requests库后,body丢失,故在requests官方库中提问,最终找到了解决办法
fiddler抓包截图如下:
第一次请求:

第二次请求:

3、最终request库的参与者回复了我的疑问,提示我需要在第一次读取文件后,把光标挪到首位,或关闭文件,在第二次调用时,再次从文件首位开始读取

4、修改后的代码:
from requests_toolbelt import MultipartEncoder
import requests def read_file(filepath='test.txt'):
fp = open(filepath, 'rb')
# 这里要把光标挪到首位,或者直接fp.close()关闭文件
fp.seek(0)
return fp
print(read_file())
m = MultipartEncoder(fields={'upload':read_file()},
boundary='----WebKitFormBoundarytZTJQrWcjjcJIMVQ')
params = {'path': 'test.txt',
'token': '',
'num': 0, 'offset': 0,
'limit': 8}
response = requests.post('http://httpbin.org/post',
params=params,
data=m,
headers={'Content-Type': m.content_type})
print("1: ", response.text) # 这里重新组装,并调用一下获取文件方法
m1 = MultipartEncoder(fields={'upload': read_file()},
boundary='----WebKitFormBoundarytZTJQrWcjjcJIMVQ')
params1 = {'path': 'test.txt',
'token': '',
'num': 0, 'offset': 0,
'limit': 8}
response1 = requests.post('http://httpbin.org/post',
params=params1,
data=m1,
headers={'Content-Type': m1.content_type})
print("2: ", response1.text)
在此备注下,以防以后再次踩坑!!!
记录python上传文件的坑(2)的更多相关文章
- 记录python上传文件的坑(1)
import random import string import requests from requests_toolbelt import MultipartEncoder f = '2019 ...
- python 上传文件
上周产品给我提了个需求,大体是做一个后台系统,管理游戏比赛落地页的数据更新,难点在于需要给CDN上传文件.现在把经验记录下来,下次有类似的需求能提高开发效率. 我使用的是网宿CDN,没有用网宿的SDK ...
- 利用iframe无刷新上传文件的坑
页面里经常要用到文件上传的功能,而且要求页面不刷新,先说一下原理:页面里放一个file控件和submit按钮,外面用form表单包住,给form表单加上对应的属性值,action.method.ent ...
- [python]上传文件验证
上传文件验证 上传文件验证分为:1.文件头验证 2.文件类型验证 3.文件后缀验证 获取文件上传的二进制数据 # 获取上传文件 file = request.files.get('file') if ...
- python上传文件接口
1.由于公司做接口测试,遇到了上传文件,一直搞了好久,原来是加了头部的原因def test_79(self): '''导入配置文件''' request = e['mysqlshujuku'] url ...
- windows上python上传下载文件到linux服务器指定路径【转】
从windows上传文件到linux,目录下的文件夹自动创建 #!/usr/bin/env python # coding: utf-8 import paramiko import datetime ...
- 上传文件及$_FILES的用法实例
Session变量($_SESSION):�php的SESSION函数产生的数据,都以超全局变量的方式,存放在$_SESSION变量中.1.Session简介SESSION也称为会话期,其是存储在服务 ...
- 上传文件Base64格式(React)
记录一下上传文件时将文件数据转为Base64的方法 通过 FileReader对象创建一个实例,然后使用 readAsDataURL方法将数据转为Base64格式 注意: 读取过程是异步的 绑定onl ...
- nodejs 上传文件 upload
只是现在主要用nodejs做后端了,所以记录一些上传文件的使用方法. 上传文件的主要方式: 1.form上传,优点是方便,缺点是没法回调,上传后返回的数据没法处理 2.ajax上传,优点是可控制,有回 ...
随机推荐
- HDU3247 Resource Archiver (AC自动机+spfa+状压DP)
Great! Your new software is almost finished! The only thing left to do is archiving all your n resou ...
- UVA-11995
There is a bag-like data structure, supporting two operations:1 x Throw an element x into the bag.2 ...
- numpy的基本API(二)——维数操作
numpy的基本维数操作API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.copyto(dst, src) copyto方法将数组src复制到 ...
- 摄像头CMOS和CCD的比较
转载自网络,在此做一下总结,仅供参考: 1.CCD每曝光一次,在快门关闭后进行像素转移处理,将每一行中每一个像素(pixel)的电荷信号依序传入“缓冲器”中,由底端的线路引导输出至 CCD 旁的放大器 ...
- ARTS-S EN0001-In tech race with China, US universities may lose a vital edge
原文 The U.S. is still out in front of global rivals when it comes to innovation, but American univers ...
- CYPRESS最新的USB3.0控制器
CYPRESS近日发布了其最新的USB3.0控制器,产品序号为CX3,主要是针对高像素摄像头方面的应用,接口支持MIPI的CSI-2,并不支持传统的基于并口的数据传输模式. MIPI(Mobile I ...
- linux—chown
1 .修改 /usr/local下bin目录的所属者 2.修改 /usr/local下bin目录的所属组 3.修改 /usr/local下games目录的所属者和所属组 4.修改 /usr/local ...
- Python发送邮件以及对其封装
对Python发送邮件进行封装 Python发送邮件分为四步 连接到smtp服务器 登陆smtp服务器 准备邮件 发送邮件 导入所需要的包 import smtplib from email.mime ...
- Spring-security-oAuth2分享
Spring-security-oAuth2分享 oAuth2简介 OAuth 2.0是用于授权的行业标准协议.OAuth 2.0致力于简化客户端开发人员的工作,同时为Web应用程序,桌面应用程序,移 ...
- Java垃圾回收机制你还不明白?一线大厂面试必问的!
什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制. 所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象:而未使用中的对象(未 ...