2017-09-13 11 views
0

J'ai actuellement une commande cURL qui fonctionne dans mon environnement. Je dois convertir en un python 2,7 urllib équivalent et ont besoin d'une aideConversion de cURL POST en urllib2 sans requêtes

commande cURL en question:

curl -k -v -XPOST -H "Authorization: Bearer $Token" -F [email protected]${local_filename} https://interesting_url.com/ 

J'ai besoin de la capacité à supporter à la fois un en-tête (H) et une forme/fichier (-F) et n'ont pas encore réussi.

This post includes a discussion on headers, mais je n'ai pas été en mesure d'obtenir le « -F » travail équivalent

+3

Si vous pouvez utiliser les requêtes, vous pouvez utiliser https://curl.trillworks.com/ pour traduire la commande cURL –

+0

Que faire si nous sommes bloqués sur Python 2.7 et que nous ne pouvons pas utiliser pip? – Numpty

+0

Requests fonctionne très bien avec 2.7, et vous devriez pouvoir l'installer en [téléchargeant le repo] (https://github.com/requests/requests/releases) et en cours d'exécution 'python setup.py install' –

Répondre

1

Avec python3 vous pouvez le faire avec requests:

import requests 

headers = {'Authorization': 'Bearer $Token'} 

files = [('file', open('${local_filename}', 'rb'))] 

requests.post('https://interesting_url.com/', headers=headers, files=files, verify=False) 

fichiers Télécharger des avec urllib2 est une tâche compliquée (example). Donc, je vous suggère requests.

Réponse longue sans utiliser de pépin et des paquets tiers

Vous pouvez implémenter la classe personnalisée MultiPartForm puis l'utiliser pour encoder les fichiers:

import itertools 
import mimetools 
import mimetypes 
from cStringIO import StringIO 
import urllib 
import urllib2 

class MultiPartForm(object): 
    """Accumulate the data to be used when posting a form.""" 

    def __init__(self): 
     self.form_fields = [] 
     self.files = [] 
     self.boundary = mimetools.choose_boundary() 
     return 

    def get_content_type(self): 
     return 'multipart/form-data; boundary=%s' % self.boundary 

    def add_field(self, name, value): 
     """Add a simple field to the form data.""" 
     self.form_fields.append((name, value)) 
     return 

    def add_file(self, fieldname, filename, fileHandle, mimetype=None): 
     """Add a file to be uploaded.""" 
     body = fileHandle.read() 
     if mimetype is None: 
      mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' 
     self.files.append((fieldname, filename, mimetype, body)) 
     return 

    def __str__(self): 
     """Return a string representing the form data, including attached files.""" 
     # Build a list of lists, each containing "lines" of the 
     # request. Each part is separated by a boundary string. 
     # Once the list is built, return a string where each 
     # line is separated by '\r\n'. 
     parts = [] 
     part_boundary = '--' + self.boundary 

     # Add the form fields 
     parts.extend(
      [ part_boundary, 
       'Content-Disposition: form-data; name="%s"' % name, 
       '', 
       value, 
      ] 
      for name, value in self.form_fields 
      ) 

     # Add the files to upload 
     parts.extend(
      [ part_boundary, 
       'Content-Disposition: file; name="%s"; filename="%s"' % \ 
       (field_name, filename), 
       'Content-Type: %s' % content_type, 
       '', 
       body, 
      ] 
      for field_name, filename, content_type, body in self.files 
      ) 

     # Flatten the list and add closing boundary marker, 
     # then return CR+LF separated data 
     flattened = list(itertools.chain(*parts)) 
     flattened.append('--' + self.boundary + '--') 
     flattened.append('') 
     return '\r\n'.join(flattened) 

with open(`local_file.txt`) as f: 
    form = MultiPartForm() 
    form.add_file('file', `local_file`, 
        fileHandle=f) 

    # Build the request 
    request = urllib2.Request('https://interesting_url.com/') 
    request.add_header('Authorization', 'Bearer $Token') 
    body = str(form) 
    request.add_header('Content-type', form.get_content_type()) 
    request.add_header('Content-length', len(body)) 
    request.add_data(body) 

    print 
    print 'OUTGOING DATA:' 
    print request.get_data() 

    print 
    print 'SERVER RESPONSE:' 
    print urllib2.urlopen(request).read() 

The source

+0

Et si nous étions bloqués sur Python 2.7 et que nous ne pouvions pas utiliser pip? – Numpty

+1

@Numpty, voir la réponse mise à jour avec la version compliquée de la demande sans installer des paquets supplémentaires –

+0

Merci - pourrait me prendre un jour pour adapter cela et tester. Vous ne plaisantiez pas sur la complexité: | – Numpty

0

Essayez de regarder dans la bibliothèque de demandes . Vous pouvez l'installer en utilisant pip install requests après cela, il suffit de rechercher un exemple de code en ligne. Selon votre application, cela peut varier. La bibliothèque de requêtes vous permet de faire beaucoup de choses. Il y a beaucoup de documentation. Je vous recommande fortement de le vérifier.