如何发送一个";“多部分/表单数据”;用python处理请求?
如何用python发送带有请求的如何发送一个";“多部分/表单数据”;用python处理请求?,python,python-2.7,multipartform-data,python-requests,Python,Python 2.7,Multipartform Data,Python Requests,如何用python发送带有请求的多部分/表单数据?如何发送文件,我理解,但是如何通过这种方法发送表单数据我不理解。基本上,如果指定文件参数(字典),那么请求将发送一个多部分/表单数据POST,而不是应用程序/x-www-form-urlencodedPOST。但是,您不限于使用该词典中的实际文件: >>> import requests >>> response = requests.post('http://httpbin.org/post', files=
多部分/表单数据
?如何发送文件,我理解,但是如何通过这种方法发送表单数据我不理解。基本上,如果指定文件
参数(字典),那么请求
将发送一个多部分/表单数据
POST,而不是应用程序/x-www-form-urlencoded
POST。但是,您不限于使用该词典中的实际文件:
>>> import requests
>>> response = requests.post('http://httpbin.org/post', files=dict(foo='bar'))
>>> response.status_code
200
而httpbin.org让你知道你发布的标题是什么;在response.json()
中,我们有:
>>> from pprint import pprint
>>> pprint(response.json()['headers'])
{'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'close',
'Content-Length': '141',
'Content-Type': 'multipart/form-data; '
'boundary=c7cbfdd911b4e720f1dd8f479c50bc7f',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.21.0'}
更好的是,通过使用元组而不是单个字符串或字节对象,可以进一步控制每个部分的文件名、内容类型和附加头。元组应该包含2到4个元素;文件名、内容、可选的内容类型和可选的其他标题字典
我将使用带有None
的元组形式作为文件名,以便从这些部分的请求中删除filename=“…”
参数:
>>> files = {'foo': 'bar'}
>>> print(requests.Request('POST', 'http://httpbin.org/post', files=files).prepare().body.decode('utf8'))
--bb3f05a247b43eede27a124ef8b968c5
Content-Disposition: form-data; name="foo"; filename="foo"
bar
--bb3f05a247b43eede27a124ef8b968c5--
>>> files = {'foo': (None, 'bar')}
>>> print(requests.Request('POST', 'http://httpbin.org/post', files=files).prepare().body.decode('utf8'))
--d5ca8c90a869c5ae31f70fa3ddb23c76
Content-Disposition: form-data; name="foo"
bar
--d5ca8c90a869c5ae31f70fa3ddb23c76--
文件
也可以是两个值元组的列表,如果您需要排序和/或使用相同名称的多个字段:
requests.post(
'http://requestb.in/xucj9exu',
files=(
('foo', (None, 'bar')),
('foo', (None, 'baz')),
('spam', (None, 'eggs')),
)
)
如果同时指定文件
和数据
,则这取决于创建帖子正文所用的数据的值。如果data
是一个字符串,则只使用它;否则将同时使用数据
和文件
,首先列出数据
中的元素
还有优秀的requests toolbelt
项目,其中包括。它采用与文件
参数相同格式的字段定义,但与请求
不同,它默认不设置文件名参数。此外,它可以从打开的文件对象流式传输请求,其中请求
将首先在内存中构造请求主体:
from requests_toolbelt.multipart.encoder import MultipartEncoder
mp_encoder = MultipartEncoder(
fields={
'foo': 'bar',
# plain file object, no filename or mime type produces a
# Content-Disposition header with just the part name
'spam': ('spam.txt', open('spam.txt', 'rb'), 'text/plain'),
}
)
r = requests.post(
'http://httpbin.org/post',
data=mp_encoder, # The MultipartEncoder is posted as data, don't use files=...!
# The MultipartEncoder provides the content-type header with the boundary:
headers={'Content-Type': mp_encoder.content_type}
)
字段遵循相同的约定;使用包含2到4个元素的元组添加文件名、部分mime类型或额外的头。与files
参数不同,如果不使用元组,则不会尝试查找默认的filename
值。自从编写了以前的答案后,请求已更改。有关更多详细信息和示例,请查看
简而言之,files参数采用dict
,键为表单字段的名称,值为字符串或2、3或4长度元组,如请求快速启动中的部分所述:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
在上面,元组的组成如下:
(filename, data, content_type, headers)
如果该值只是一个字符串,则文件名将与键相同,如下所示:
>>> files = {'obvius_session_id': '72c2b6f406cdabd578c5fd7598557c52'}
Content-Disposition: form-data; name="obvius_session_id"; filename="obvius_session_id"
Content-Type: application/octet-stream
72c2b6f406cdabd578c5fd7598557c52
如果该值为元组,且第一个条目为None
,则不会包括filename属性:
>>> files = {'obvius_session_id': (None, '72c2b6f406cdabd578c5fd7598557c52')}
Content-Disposition: form-data; name="obvius_session_id"
Content-Type: application/octet-stream
72c2b6f406cdabd578c5fd7598557c52
即使您不需要上传任何文件,也需要使用files
参数发送多部分表单POST请求
从原始来源:
def请求(方法、url、**kwargs):
“”“构造并发送:类:`Request`。
...
:param files:(可选)名称字典:类似文件的对象``
(或``{'name':文件元组}```用于多部分编码上载。
``文件元组``可以是2元组`('filename',fileobj)`,
三元组“`('filename',fileobj,'content\u type')``
或者一个4元组“`('filename',fileobj,'content\u type',custom\u headers)``,
其中,``content-type``是一个字符串
定义给定文件的内容类型
“自定义”标题是类似dict的对象
包含要为文件添加的其他标头。
相关部分是:文件元组可以是一个
<2-元组
,<3-元组
或一个
<4-元组
基于上述内容,最简单的多部分表单请求(包括要上载的文件和表单字段)如下所示:
多部分表单数据={
'file2':('custom_file_name.zip',open('myfile.zip','rb'),
“操作”:(无,“存储”),
“路径”:(无,/path1”)
}
response=requests.post('https://httpbin.org/post,files=multipart_form_data)
打印(response.content)
☝ 请注意,None
作为纯文本字段元组中的第一个参数-这是文件名字段的占位符,仅用于文件上载,但对于传递None
的文本字段,作为提交数据所需的第一个参数
具有相同名称的多个字段
如果需要发布具有相同名称的多个字段,则可以将负载定义为元组列表(或元组),而不是字典:
multipart_form_data = (
('file2', ('custom_file_name.zip', open('myfile.zip', 'rb'))),
('action', (None, 'store')),
('path', (None, '/path1')),
('path', (None, '/path2')),
('path', (None, '/path3')),
)
流式处理请求API
如果上述API对您来说不是足够的Python,那么考虑使用(<代码> PIPStestRealStestSuthSooStope),该模块是支持文件上传流的模块的扩展,并且可以用来代替“代码>文件< /代码>,也允许您将有效载荷定义为字典、元组或列表。
multipartincoder
可用于包含或不包含实际上载字段的多部分请求。它必须分配给数据
参数
导入请求
从请求\u toolbelt.multipart.encoder导入multipartincoder
多部分数据=多部分编码器(
田地={
#文件上载字段
'file':('file.zip',open('file.zip','rb'),'text/plain')
#纯文本字段
“field0”:“value0”,
“字段1”:“值1”,
}
)
response=requests.post('http://httpbin.org/post,data=multipart_data,
headers={'Content-Type':多部分数据.Content\u-Type})
如果需要发送多个同名字段,或者表单字段的顺序很重要,则
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)
autocomplete="off" name="image">
import requests
site = 'https://prnt.sc/upload.php' # the site where you upload the file
filename = 'image.jpg' # name example
up = {'image':(filename, open(filename, 'rb'), "multipart/form-data")}
data = {
"Button" : "Submit",
}
request = requests.post(site, files=up, data=data)
import requests
latest_file = 'path/to/file'
url = "http://httpbin.org/apiToUpload"
files = {'fieldName': open(latest_file, 'rb')}
r = requests.put(url, files=files)
var upload = multer().single('fieldName');
url = 'https://<file_upload_url>'
fp = '/Users/jainik/Desktop/data.csv'
files = {'file': open(fp, 'rb')}
payload = {'file_id': '1234'}
response = requests.put(url, files=files, data=payload, verify=False)
# -*- coding: utf-8 *-*
import json, requests
URL_SERVER_TO_POST_DATA = "URL_to_send_POST_request"
HEADERS = {"Content-Type" : "multipart/form-data;"}
def getPointsCC_Function():
file_data = {
'var1': (None, "valueOfYourVariable_1"),
'var2': (None, "valueOfYourVariable_2")
}
try:
resElastic = requests.post(URL_GET_BALANCE, files=file_data)
res = resElastic.json()
except Exception as e:
print(e)
print (json.dumps(res, indent=4, sort_keys=True))
getPointsCC_Function()
files={"foo": "bar"}
url = "https://my-bitbucket.com/rest/api/latest/projects/FOO/repos/bar/browse/foobar.txt"
payload = {'branch': 'master',
'content': 'text that will appear in my file',
'message': 'uploading directly from python'}
files = {"foo": "bar"}
response = requests.put(url, data=payload, files=files)
import requests
# assume sending two files
url = "put ur url here"
f1 = open("file 1 path", 'rb')
f2 = open("file 2 path", 'rb')
response = requests.post(url,files={"file1 name": f1, "file2 name":f2})
print(response)
import http.client
import mimetypes
from codecs import encode
conn = http.client.HTTPSConnection("data.XXXX.com")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=batchSize;'))
dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))
dataList.append(encode("1"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=file; filename={0}'.format('FileName-1.json')))
fileType = mimetypes.guess_type('FileName-1.json')[0] or 'application/octet-stream'
dataList.append(encode('Content-Type: {}'.format(fileType)))
dataList.append(encode(''))
with open('FileName-1.json', 'rb') as f:
dataList.append(f.read())
dataList.append(encode('--'+boundary+'--'))
dataList.append(encode(''))
body = b'\r\n'.join(dataList)
payload = body
headers = {
'Cookie': 'XXXXXXXXXXX',
'Content-type': 'multipart/form-data; boundary={}'.format(boundary)
}
conn.request("POST", "/fileupload/uri/XXXX", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))