没有合适的资源?快使用搜索试试~ 我知道了~
首页Python requests上传文件实现步骤
资源详情
资源评论
资源推荐

Python requests上传文件实现步骤上传文件实现步骤
主要介绍了Python requests上传文件实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有
一定的参考学习价值,需要的朋友可以参考下
官方文档:https://2.python-requests.org//en/master/
工作中涉及到一个功能,需要上传附件到一个接口,接口参数如下:
使用http post提交附件 multipart/form-data 格式,url : http://test.com/flow/upload,
字段列表:
md5: //md5加密(随机值_当时时间戳)
filesize: //文件大小
file: //文件内容(须含文件名)
返回值:
{"success":true,"uploadName":"tmp.xml","uploadPath":"uploads\/201311\/758e875fb7c7a508feef6b5036119b9f"}
由于工作中主要用python,并且项目中已有使用requests库的地方,所以计划使用requests来实现,本来以为是很简单的一个
小功能,结果花费了大量的时间,requests官方的例子只提到了上传文件,并不需要传额外的参数:
https://2.python-requests.org//en/master/user/quickstart/#post-a-multipart-encoded-file
>>> url = 'https://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
但是如果涉及到了参数的传递时,其实就要用到requests的两个参数:data、files,将要上传的文件传入files,将其他参数传
入data,request库会将两者合并到一起做一个multi part,然后发送给服务器。
最终实现的代码是这样的:
with open(file_name) as f:
content = f.read()
request_data = {
'md5':md5.md5('%d_%d' % (0, int(time.time()))).hexdigest(),
'filesize':len(content),
}
files = {'file':(file_name, open(file_name, 'rb'))}
MyLogger().getlogger().info('url:%s' % (request_url))
resp = requests.post(request_url, data=request_data, files=files)
虽然最终代码可能看起来很简单,但是其实我费了好大功夫才确认这样是OK的,中间还翻了requests的源码,下面记录一下
翻阅源码的过程:
首先,找到post方法的实现,在requests.api.py中:
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
这里可以看到它调用了request方法,咱们继续跟进request方法,在requests.api.py中:
def request(method, url, **kwargs):
"""Constructs and sends a :class:`Request <Request>`.
:param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0