Vous devez utiliser le files
pour envoyer une demande POST de formulaire multipartite. même lorsque vous n'avez pas besoin de télécharger de fichiers.
De l'original demande source :
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.
La partie pertinente est : file-tuple
can be a
:
-
2-tuple
( nom de fichier, fichierobj )
-
3-tuple
( filename, fileobj, content_type )
-
4-tuple
( filename, fileobj, content_type, custom_headers ).
Ce qui n'est pas forcément évident, c'est que fileobj
peut être soit un objet fichier réel lorsqu'il s'agit de fichiers, OU une chaîne de caractères lorsqu'il s'agit de champs de texte brut.
Sur la base de ce qui précède, la demande de formulaire multipartite la plus simple, qui comprend à la fois des fichiers à télécharger et des champs de formulaire, ressemblera à ceci :
import requests
multipart_form_data = {
'upload': ('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)
Notez le None
en tant que premier argument dans le tuple pour les champs de texte brut - il s'agit d'un caractère générique pour le champ nom de fichier qui n'est utilisé que pour les téléchargements de fichiers, mais pour les champs de texte passant par l'option None
comme premier paramètre est nécessaire pour que les données soient soumises.
Plusieurs champs portant le même nom
Si vous devez afficher plusieurs champs portant le même nom, au lieu d'un dictionnaire, vous pouvez définir votre charge utile comme une liste (ou un tuple) de tuples :
multipart_form_data = (
('file2', ('custom_file_name.zip', open('myfile.zip', 'rb'))),
('action', (None, 'store')),
('path', (None, '/path1')),
('path', (None, '/path2')),
('path', (None, '/path3')),
)
Demandes de streaming API
Si l'API ci-dessus n'est pas assez pythique pour vous, alors envisagez d'utiliser demande une ceinture porte-outils ( pip install requests_toolbelt
) qui est une extension de la demandes principales qui prend en charge le téléchargement de fichiers en continu, ainsi que le module MultipartEncoder qui peut être utilisé à la place de files
et qui vous permet également de définir la charge utile comme un dictionnaire, un tuple ou une liste.
MultipartEncoder
peut être utilisé à la fois pour les demandes multipartites avec ou sans champs de téléchargement réels. Il doit être affecté à l'élément data
paramètre.
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})
Si vous devez envoyer plusieurs champs portant le même nom, ou si l'ordre des champs du formulaire est important, vous pouvez utiliser un tuple ou une liste au lieu d'un dictionnaire :
multipart_data = MultipartEncoder(
fields=(
('action', 'ingest'),
('item', 'spam'),
('item', 'sausage'),
('item', 'eggs'),
)
)
0 votes
Votre question n'est pas vraiment claire. Que voulez-vous obtenir ? Souhaitez-vous envoyer des données "multipart/form-data" sans téléchargement de fichier dans le formulaire ?
4 votes
Le fait que
files
est utilisé pour faire les deux est une très mauvaise API. J'ai soulevé un problème intitulé Envoi de données multipart - nous avons besoin d'une meilleure API pour régler ce problème. Si vous êtes d'accord pour dire que l'utilisationfiles
Le paramètre permettant d'envoyer des données en plusieurs parties est, au mieux, trompeur. Veuillez demander la modification de l'API dans la question ci-dessus.0 votes
@PiotrDobrogost ce problème est clos. N'encouragez pas les gens à commenter les questions fermées, qu'elles soient pertinentes ou non.
1 votes
C'est pas grave, je viens de réaliser que ton commentaire a été posté avant la fermeture. Je déteste que StackOverflow ne garde pas les choses dans l'ordre chronologique.
1 votes
Vérifier cette réponse stackoverflow.com/a/64586578/8826047 La frontière est importante !