जब आप किसी भी फाइल को अपलोड करने की आवश्यकता नहीं है तब भी आपको 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 a2-tuple, ।3-tupleor a4-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)
Fields सादे पाठ फ़ील्ड के लिए टपल में पहले तर्क के 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 आपके लिए पर्याप्त पाइथोनिक नहीं है, तो अनुरोध टूलबेल्ट ( pip install requests_toolbelt) का उपयोग करने पर विचार करें जो कि कोर अनुरोध मॉड्यूल का एक विस्तार है जो फ़ाइल अपलोड स्ट्रीमिंग के लिए समर्थन प्रदान करता है और साथ ही मल्टीपार्ट एंकोडर जिसका उपयोग किया जा सकता है filesऔर जो इसकी अनुमति भी देता है आप पेलोड को डिक्शनरी, टपल या सूची के रूप में परिभाषित करते हैं।
MultipartEncoderवास्तविक अपलोड फ़ील्ड्स के साथ या बिना मल्टीपार्ट अनुरोधों के लिए दोनों का उपयोग किया जा सकता है। इसे dataपैरामीटर को सौंपा जाना चाहिए ।
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
multipart_data = MultipartEncoder(
fields={
# a file upload field
'file': ('file.zip', open('file.zip', 'rb'), 'text/plain')
# plain text fields
'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'),
)
)