Herhangi bir dosya yüklemeniz gerekmediğinde bilefiles
çok bölümlü bir POST isteği göndermek için parametreyi kullanmanız gerekir.
Orijinal istekler kaynağından:
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.
İlgili bölüm: file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Yukarıdakilere dayanarak, hem yüklenecek dosyaları hem de form alanlarını içeren en basit çok parçalı form isteği aşağıdaki gibi görünecektir:
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)
☝ Not None
düz metin alanları için başlığın ilk argüman olarak - bu sadece dosya yüklemeleri için kullanılan dosya adı alanı için bir yer tutucudur ama geçen metin alanları için None
veri sunulacak için ilk parametre olarak gereklidir .
Aynı ada sahip birden çok alan
Aynı ada sahip birden fazla alanı yayınlamanız gerekiyorsa, sözlük yerine yükünüzü bir grup listesi (veya bir demet) olarak tanımlayabilirsiniz:
multipart_form_data = (
('file2', ('custom_file_name.zip', open('myfile.zip', 'rb'))),
('action', (None, 'store')),
('path', (None, '/path1')),
('path', (None, '/path2')),
('path', (None, '/path3')),
)
Akış istekleri API'sı
Yukarıdaki API sizin için pythonic yeterli değilse, o zaman kullanmayı düşünün istekleri toolbelt ( pip install requests_toolbelt
bir uzantısı olan) çekirdek istekleri bu dosya, yükleme yanı sıra Akış için destek sağlar modülü MultipartEncoder yerine kullanılabilir files
ve hangi zamanda sağlar yükü sözlük, grup veya liste olarak tanımlarsınız.
MultipartEncoder
hem gerçek yükleme alanları olan veya olmayan çok parçalı istekler için kullanılabilir. data
Parametreye atanmalıdır .
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})
Aynı ada sahip birden çok alan göndermeniz gerekiyorsa veya form alanlarının sırası önemliyse, sözlük yerine bir demet veya liste kullanılabilir:
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)