Seite 1 von 2
cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 10:11
von andyritter
Hallo zusammen, bin noch eine Neuling in Python und versuche diese Abfrage mit Python umzusetzten
curl -s -H 'X-Auth-Token:abcd' "
http://127.0.0.1:5000/v2.0/Liste"
Als Antwort kommt in der Shell ein JSON.
Danke für eure Hilfe
Gruß Andreas
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 10:45
von Sirius3
@andyritter: Du willst jetzt nicht wissen, dass es dafür in der Standardbibliothek das Modul urllib2 gibt und man am besten das 3rd-party Modul requests für solche Aufgaben nimmt. Denn das sagt einem google wenn man nur nach python und http sucht.
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 10:57
von andyritter
Hallo Sirius3,
ich habe das Problem, dass bei meinen bisherigen Versuchen als Neuling in Python immer wieder einen Bad Request vom Server zurückerhalten oder bin gar nicht bis zum Server durchgekommen. Da ich das ganze noch nicht so nachvollziehen kann und auch mit den Modulen noch zum Teil am Verständnis hänge, hier die Nachfrage.
Gruß Andy
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 11:02
von DasIch
Bei einem Bad Request würde ich mal davon ausgehen dass der X-Auth-Token Header nicht gesetzt ist.
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 11:17
von Sirius3
@andyritter: das sind z.B. Informationen, die man in eine Frage schreiben könnte. Dazu ist immer hilfreich den Code zu posten, der den Fehler produziert und auch die vollständige Fehlermeldung inklusive Traceback.
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 11:58
von andyritter
Danke Sirius, ich gelobe Besserung
Ich habe bereits eine Abfrage an den Server wegen des Tokens, dies wird mit httplib2 ausgeführt und ist erfolgreich. In gleicher Manier wollte ich nun auch diese Liste abrufen.
Shell, (liefert eine JSON Antwort.)
curl -s -H 'X-Auth-Token:abcd' "
http://127.0.0.1:5000/v2.0/Liste"
Mein Versuch mit httplib2
import httplib2 as http
import json
import base64
try:
from urlparse import urlparse
except ImportError:
from urllib.parse import urlparse
token_id = 'abcd'
body_string_tenants = 'X-Auth-Token:' + token_id
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json; charset=UTF-8'
}
uri = '
http://127.0.0.1:5000'
path = '/v2.0/Liste'
target = urlparse(uri+path)
method = 'GET'
body = '{"X-Auth-Token:abcd"}'
h = http.Http()
response, tenant_list = h.request(
target.geturl(),
method,
body,
headers)
Die Fehlermeldung:
{"error": {"message": "Expecting to find valid JSON in request body - the server could not comply with the request since it is either malformed or otherwise incorrect. The client is assumed to be in error.", "code": 400, "title": "Bad Request"}}
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 12:08
von DasIch
Nun die Fehlermeldung beschreibt das Problem doch recht deutlich und ist auch offensichtlich richtig.
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 12:30
von andyritter
@DasIch
Die Fehlermeldung an sich verstehe ich ja, allerdings komme ich zu keine Lösung, in der das dann funktioniert.
lasse ich die ' im body weg erhalte ich folgende Fehlermeldung:
Traceback (most recent call last):
File "/home/andreas/Schreibtisch/Liste.py", line 41, in <module>
headers)
File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1570, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1317, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/usr/lib/python2.7/site-packages/httplib2-0.8-py2.7.egg/httplib2/__init__.py", line 1253, in _conn_request
conn.request(method, request_uri, body, headers)
File "/usr/lib64/python2.7/httplib.py", line 979, in request
self._send_request(method, url, body, headers)
File "/usr/lib64/python2.7/httplib.py", line 1013, in _send_request
self.endheaders(body)
File "/usr/lib64/python2.7/httplib.py", line 975, in endheaders
self._send_output(message_body)
File "/usr/lib64/python2.7/httplib.py", line 839, in _send_output
self.send(message_body)
File "/usr/lib64/python2.7/httplib.py", line 811, in send
self.sock.sendall(data)
File "/usr/lib64/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
TypeError: must be string or buffer, not set
daher komme ich mit meinem Anfängerwissen hier leider nicht weiter.
Mit Wireshark habe ich die Anfragen mit geschnitten und folgende Ausgaben erhalten:
Curl:
GET /v2.0/tenants HTTP/1.1
User-Agent: curl/7.29.0
Host: 127.0.0.1:5000
Accept: */*
X-Auth-Token:abcd
HTTP/1.1 200 OK
Date: Fri, 11 Mar 2016 08:29:58 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Vary: X-Auth-Token
Content-Length: 427
Connection: close
Content-Type: application/json
{......Liste....}]} => alles ok
mit Python und meiner Abfrage:
GET /v2.0/tenants HTTP/1.1
Host: 127.0.0.1:5000
Content-Length: 49
accept-encoding: gzip, deflate
accept: */*
user-agent: Python-httplib2/0.8 (gzip)
{"X-Auth-Token:abcd"}HTTP/1.1 400 Bad Request
Date: Fri, 11 Mar 2016 08:56:03 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Vary: X-Auth-Token
Content-Length: 245
Connection: close
Content-Type: application/json
{"error": {"message": "Expecting to find valid JSON in request body - the server could not comply with the request since it is either malformed or otherwise incorrect. The client is assumed to be in error.", "code": 400, "title": "Bad Request"}}
Gibt es eine einfachere Weise um an der REST Schnittstelle von OpenStack diese Liste zu erhalten?
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 13:15
von Sirius3
Wußte gar nicht, dass irgendein Server bei einem GET-Request den Body parst. Macht ja auch wenig Sinn.
Re: cURL REquest mit Python 2.7
Verfasst: Freitag 11. März 2016, 14:14
von Dav1d
Steht doch da .. Einmal schickst du den X-Auth-Token als Header mit (curl) und einmal versuchst du den über den Body zu übergeben (Python).
Edit: Du willst dir eventuell
requests anschauen. Wenn du eine Requests-Session verwendest, kannst du den Header hinzufügen und brauchst dich nicht mehr darum zu kümmern.
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 19:15
von andyritter
@Dav1d
leider habe ich Deine Antwort nicht verstanden.
Verwende ich requests, so erhalte ic folgende Fehlermeldung:
import requests
r = requests.get('
http://127.0.0.1:5000/v2.0/Liste')
r.json()
Meldung:
Traceback (most recent call last):
File "/home/andreas/Schreibtisch/tenants_list_requests_test.py", line 1, in <module>
import requests
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/__init__.py", line 58, in <module>
from . import utils
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/utils.py", line 26, in <module>
from .compat import parse_http_list as _parse_list_header
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/compat.py", line 38, in <module>
from urllib2 import parse_http_list
File "/home/andreas/Schreibtisch/urllib2.py", line 4, in <module>
AttributeError: 'module' object has no attribute 'POST'
und das deutet für mich eher an, dass im Modul requests etwas nicht korrekt ist oder?
Wie würde deiner Meinung nach denn der Code mit requests aussehen?
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 19:28
von Sirius3
@andyritter: das Problem ist, dass Du ein Modul der Standardbibliothek (urllib2) durch Deine eigene Python-Datei urllib2.py überlagerst.
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 19:32
von andyritter
@Sirius3
ich finde in diesem Pfad keine Datei urllib2.py, wie könnte so etwas zustande kommen?
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 20:06
von Sirius3
Und was für eine Datei ist /home/andreas/Schreibtisch/urllib2.py?
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 20:10
von andyritter
die Datei hat die Erweiterung .pyc
Sorry, ich möchte hier niemanden angreifen oder beleidigen. Ich habe erst seit kurzem eine CetOS 7 Umgebung und auch mit Python erst vor kurzem angefangen. Daher sind das sicher alles Anfängerfragen...
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 21:40
von andyritter
@Dav1d
Bei requests komme ich leider auch nicht weiter. Ich habe mir jetzt schon eine zweite CentOS7 Maschine eingerichtet, damit ich alle Zusatzmodule unter root einrichte und nicht unter meinem User.
Bei meinem Code
import requests
url = '
http://127.0.0.1:5000/v2.0/Liste'
header = {'X-Auth-Token: abcd'}
r= requests.get(url, headers=header)
r.json()
print(r)
erhalte ich folgende Meldung:
Traceback (most recent call last):
File "/home/andreas/Dokumente/tenants_list_requests.py", line 6, in <module>
r= requests.get(url, headers=header)
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/sessions.py", line 454, in request
prep = self.prepare_request(req)
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/sessions.py", line 388, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/models.py", line 294, in prepare
self.prepare_headers(headers)
File "/usr/lib/python2.7/site-packages/requests-2.9.1-py2.7.egg/requests/models.py", line 405, in prepare_headers
self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items())
AttributeError: 'set' object has no attribute 'items'
Was mache ich falsch?
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 22:08
von pillmuncher
@andyritter: vergleich mal:
Code: Alles auswählen
>>> header = {'X-Auth-Token: abcd'}
>>> type(header)
<type 'set'>
>>> header['X-Auth-Token']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object has no attribute '__getitem__'
>>> header.items()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'set' object has no attribute 'items'
Code: Alles auswählen
>>> header = {'X-Auth-Token': 'abcd'}
>>> type(header)
<type 'dict'>
>>> header['X-Auth-Token']
'abcd'
>>> header.items()
[('X-Auth-Token', 'abcd')]
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 22:21
von andyritter
@pillmuncher
ich kann Dir da im Moment leider nicht folgen. Was möchtest Du mir damit denn erklären?
Im oberen Script wird versucht ein Set zu verwenden und im zweiten ein dictionary?
In der Dokumentation unter
http://docs.python-requests.org/en/mast ... rs-in-urls finde ich nichts konkretes zu meinem Problem

Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 22:31
von pillmuncher
@andyritter: Vergleich mal Zeichen für Zeichen:
Code: Alles auswählen
>>> header = {'X-Auth-Token: abcd'}
>>> header = {'X-Auth-Token': 'abcd'}
Re: cURL REquest mit Python 2.7
Verfasst: Samstag 12. März 2016, 22:32
von BlackJack
@andyritter: Wenn man ein Problem beim `header` hat, sollte man auch *dort* in der Dokumentation schauen und nicht bei der Übergabe von Daten:
http://docs.python-requests.org/en/mast ... om-headers 