Python Demandes Multipart HTTP POST
Je me demandais comment traduisez-vous à quelque chose comme ceci à l'aide de Python Demandes? Dans urllib2, vous pouvez manipuler manuellement les données qui sont transmises sur le fil de l'API de service, mais les Demandes de réclamations multipart l'upload de fichiers facile. Toutefois, lorsque vous essayez d'envoyer au cours de la même demande à l'aide de la Demande de la bibliothèque, je crois que c'est de ne pas spécifier certains paramètres clés dans le contenu-type pour chacune des deux parties correctement. Quelqu'un peut s'il vous plaît faire la lumière sur cette affaire. Je vous remercie à l'avance!
def upload_creative(self, account_id, file_path):
""""""
boundary = '-----------------------------' + str(int(random.random()*1e10))
parts = []
# Set account ID part.
parts.append('--' + boundary)
parts.append('Content-Disposition: form-data; name="account_id"')
parts.append('')
parts.append(str(account_id))
# Set creative contents part.
parts.append('--' + boundary)
parts.append('Content-Disposition: form-data; name="userfile"; filename="%s"' % file_path)
parts.append('Content-Type: %s' % mimetypes.guess_type(file_path)[0] or 'application/octet-stream')
parts.append('')
# TODO: catch errors with opening file.
parts.append(open(file_path, 'r').read())
parts.append('--' + boundary + '--')
parts.append('')
body = '\r\n'.join(parts)
headers = {'content-type': 'multipart/form-data; boundary=' + boundary}
url = self._resolve_url('/a/creative/uploadcreative')
req = urllib2.Request(url, headers=headers, data=body)
res = urllib2.urlopen(req)
return json.loads(res.read())
Lorsque j'examine firebug à partir de l'INTERFACE utilisateur, j'ai le dans le POSTE source.
-----------------------------662549079759661058833120391
Content-Disposition: form-data; name="userfile"; filename="IMG_1377.jpg" Content-Type: image/jpeg
ÿØÿáÃExif��MM�*���� �������ª���� ���°���������������������º�������Â(�������1�������Ê2�������Ú<�������î�������i�������þ%������p��Apple�iPhone 4���H������H�����QuickTime 7.7.1�2012:08:17 11:47:11�Mac OS X 10.7.4�������������� "�������'�����P�������0220������(������<������ �����P������X������� ����� �� ������`������h �����0100 ������� ������ ������¢�������¤��������¤��������¤��������¤ ����������������������2011:10:01 17:19:23�2011:10:01 17:19:23���4��Á��¹��¡���M���Ç»¸������N����������Ê�����W����������â�������ú�����M�����������������!�����S���d����������T�����ÿ���d���������������������Ú����%Á��r��������������t������|(�������������������7������������H������H�����ÿØÿà�JFIF��H�H��ÿþ�AppleMark ÿÛ�� % #!,!#'(***.1-)1%)*( (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÄ¢���������� ������� ���}�!1AQa"q2¡#B±ÁRÑð$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùú��w�!1AQaq"2B¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ð.¥ÛWíÇLòV³FcaoæÂÒ8§É¸(è3E¢"Ú×S^+yj�!òû0Oüµn- yè){[oÝ/¸?ÃÔMY¡ÃgÔò4êò4n͸í¶={ÔM¤¸m¯K&ñæ«,©ù»zTÝ=öØô×6¶Ö:MÑi�,Û$Oö[ª÷ª©ÆiîỤJAxj>ÞAõúu¥}lIf÷û^Â)#´y^)Ô"/·v>n~4ººµ¬æ}FURì·Î 3¿Ãèh»ÐµÈÿ�·|Gu:ß²<ëlWäG·^+¡Ó¼gâ.-Þè|ϸ*ª® }é?Ú=(i:2½Ïg!ʵÑi¤¼eþ!÷³ÍC'æCqv®ÖÊÕiçCë·øsQy#K_B´þ0s'¦|¿Þ²lò¼?½ÿ�]rZ¶¨ø·6ñÆØ·mvV;þÿ�þ=ôª¿»r\zPñtHö÷>Ù¤R#+ Á òBôR;ú²¾)!àËn<.ÁÔlÏcRäÂ&§eX´fTóLžQßt§Zµ{â t·pK]ÈL1²îýúEüxþ÷j\î×-jÏÂ>!û:^,E,>^ýêßwû+Ópæ»?i÷û5kéá¹^ 6Ddq°öÁ¯Rù¨¦yãjòÿÙ
-----------------------------662549079759661058833120391
Content-Disposition: form-data; name="account_id"
69574
-----------------------------662549079759661058833120391--
Les en-têtes dans firebug sont comme suit:
Request Headersview source
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Cache-Control no-cache
Connection keep-alive
Content-Length 1713991
Content-Type multipart/form-data; boundary=---------------------------662549079759661058833120391
Cookie instance_defaults=%7C%20%7Cen_US; access_token=75c48e
Host ui.host.com
Pragma no-cache
Referer http://ui.host.com/
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:14.0) Gecko/20100101 Firefox/14.0.1
Je suppose que ma question est est-il un moyen via les demandes de la bibliothèque pour ajuster les données afin que l':
Content-Disposition: form-data; name="userfile"; filename="IMG_1377.jpg" Content-Type: image/jpeg
et la
Content-Disposition: form-data; name="account_id"
69574
états sont à la fois présents. J'ai l'impression que je devrais faire quelque chose comme fichiers un dictionnaire de
files = {'file': open('image.jpg', 'rb'), 'account_id': 12345}
mais de toute façon modifier le Contenu-Disposition de métadonnées de chacune de ces parties séparément
requests
?Je suis d'essayer d'éditer le Contenu-Disposition de métadonnées de chaque partie du fichier en plusieurs parties de téléchargement d'une requête POST. Par exemple dans mon montage, j'ai besoin d'avoir name="userfile"; filename="IMG_1377.jpg" Content-Type: image/jpeg pour la première partie qui est le fichier de l'image, et ensuite, pour la deuxième partie, j'ai besoin de Content-Disposition: form-data; name="account_id" <valeur> j'espère qu'apporte de la clarté à la question. S'il vous plaît laissez-moi savoir si quelque chose comme cela est possible avec le python-les demandes de la bibliothèque. Merci beaucoup
OriginalL'auteur user1698138 | 2012-09-25
Vous devez vous connecter pour publier un commentaire.
avec
requests
, je crois que vous n'avez pas à être de façon manuelle, il suffit de:Je suppose que votre préoccupation réside avec vos:
Je n'ai pas prouvé à moi-même, sans l'ombre d'un doute. Mais, je pense que c'est intégré dans les demandes de ici.
Edit: Il ressemble vous pouvez avoir la normale champs dans les fichiers dict, que vous proposez:
et pourrait nommer le nom du fichier que vous voulez:
mais, vous obtiendrez un
body.write(b'Content-Type: text/plain\r\n\r\n')
sur leaccount_id
champ qui n'est probablement pas ce que vous voulez et n'ont aucun moyen de personnaliser le Contenu-Disposition pour chaque champ (pas encore sûr de savoir pourquoi vous avez besoin d'); pour le fichier et le domaine, vous obtiendrez:Content-Disposition: form-data
- qui est ce que vous montrez pour les deux.Je ne suis pas sûr que vous pouvez faire exactement ce que vous voulez avec
requests
, peut-être que vous devriez essayer une demande de fonctionnalité.urlib3
donc c'est assez bien foutu.donc, pouvez-vous spécifier manuellement le type de contenu du fichier avec
requests
? il semble qu'il utilise le même heuristique de la question, mais ne semblent pas fournir un moyen pour spécifier manuellement le CT du fichier.Je comprends, cependant, je ne pense pas que c'est la réponse à ma question. J'ai édité ma question avec plus de précisions dans l'espoir que quelqu'un aura la réponse, je suis à la recherche pour. Merci beaucoup à tous
OriginalL'auteur Skylar Saveland
OriginalL'auteur Sreenath D
J'ai trouvé que dans l'python-les demandes de la bibliothèque (v. 0.13.3), vos données seront effacés si vous incluez les "données" champ avant que le champ "fichiers" dans la demande d'appel lui-même.
Par exemple,
donnera vide de données de formulaire. Cependant, la suite vous envoyer le dictionnaire de données, à la mise en forme des données
Merci à tous pour les réponses
data
argument - voir ceci la réponse.OriginalL'auteur user1698138