คุณต้องใช้files
พารามิเตอร์เพื่อส่งคำขอ POST ในรูปแบบหลายส่วนแม้ว่าคุณจะไม่จำเป็นต้องอัปโหลดไฟล์ใด ๆ
จากแหล่งที่มาของคำขอดั้งเดิม:
def request(method, url, **kwargs):
"""Constructs and sends a :class:`Request <Request>`.
...
:param files: (optional) Dictionary of ``'name': file-like-objects``
(or ``{'name': file-tuple}``) for multipart encoding upload.
``file-tuple`` can be a 2-tuple ``('filename', fileobj)``,
3-tuple ``('filename', fileobj, 'content_type')``
or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``,
where ``'content-type'`` is a string
defining the content type of the given file
and ``custom_headers`` a dict-like object
containing additional headers to add for the file.
ส่วนที่เกี่ยวข้องคือ: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
จากข้างต้นคำขอแบบฟอร์มหลายส่วนที่ง่ายที่สุดที่มีทั้งไฟล์ที่จะอัปโหลดและฟิลด์แบบฟอร์มจะมีลักษณะดังนี้
multipart_form_data = {
'file2': ('custom_file_name.zip', open('myfile.zip', 'rb')),
'action': (None, 'store'),
'path': (None, '/path1')
}
response = requests.post('https://httpbin.org/post', files=multipart_form_data)
print(response.content)
☝ สังเกตNone
ว่าเป็นอาร์กิวเมนต์แรกใน tuple สำหรับฟิลด์ข้อความธรรมดา - นี่คือตัวยึดสำหรับฟิลด์ชื่อไฟล์ซึ่งใช้สำหรับการอัปโหลดไฟล์เท่านั้น แต่สำหรับฟิลด์ข้อความที่ส่งผ่าน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 ด้านบนไม่ pythonic เพียงพอสำหรับคุณให้พิจารณาใช้request toolbelt ( pip install requests_toolbelt
) ซึ่งเป็นส่วนขยายของโมดูลคำร้องขอหลักที่ให้การสนับสนุนการสตรีมการอัพโหลดไฟล์รวมถึงMultipartEncoderซึ่งสามารถใช้แทนfiles
ได้และยังช่วยให้ คุณกำหนดเพย์โหลดเป็นพจนานุกรมทูเพิลหรือรายการ
MultipartEncoder
สามารถใช้ได้ทั้งกับคำขอหลายส่วนที่มีหรือไม่มีช่องอัปโหลดจริง ต้องกำหนดให้กับdata
พารามิเตอร์
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
multipart_data = MultipartEncoder(
fields={
'file': ('file.zip', open('file.zip', 'rb'), 'text/plain')
'field0': 'value0',
'field1': 'value1',
}
)
response = requests.post('http://httpbin.org/post', data=multipart_data,
headers={'Content-Type': multipart_data.content_type})
หากคุณต้องการส่งหลายช่องที่มีชื่อเดียวกันหรือหากลำดับของช่องฟอร์มมีความสำคัญคุณสามารถใช้ทูเพิลหรือรายการแทนพจนานุกรมได้:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)