2017-01-18 7 views
0

Mit der Urlib in Python 3.6 habe ich eine Anfrage erstellt und Header angelegt. Python scheint diese Direktive jedoch vollständig zu ignorieren, und wenn das ErgebnisPython: request.has_header (header) gibt immer false zurück

ist, ist das Ergebnis falsch. Dies gilt auch für andere Header außer "Verbindung". Interessanterweise gibt 'connection' auch false zurück. Ich war nicht in der Lage, eine gute Quelle dafür zu finden, wie man Kopfzeilen in Python genau deklariert, die konsistent funktionieren (und Python ist anscheinend extrem case-sensitive Header-Namen), also wenn jemand irgendwelche Empfehlungen hätte, würde ich mich interessieren, sie zu hören !

Mein Relevant ist:

head = { 
    'content-type': 'application/x-www-form-urlencoded', 
    'connection': 'keep-alive', 
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36' 
} 

req = Request(url, post_bytes, head) 
print(req.has_header('content-type') 

Ersatz ‚content-type‘ für eine der anderen gegeben Header und das Ergebnis ist immer noch falsch. Es ist fast wie die Standard-Python-Anfrage enthält keine Header, aber ... sicherlich wäre das nicht der Fall?

Vielen Dank für einen Einblick!

Antwort

3

Haben Sie versucht, (beachten Sie, dass ‚Typ‘ Klein ist):

req.has_header('Content-type') 

Wenn Sie req.header_items() verwenden, können Sie sehen, dass die Header-Tasten haben Sie den ersten Buchstaben (und nur der erste Buchstabe) kapitalisiert.

+0

Das hat funktioniert. Ich hatte nicht erwartet, dass das zweite Wort mit Bindestrich nicht wie das erste Wort großgeschrieben wird. Einige Beispielheader mit Firebug zu betrachten, schlug vor, dass beide Wörter großgeschrieben werden, aber es scheint, dass dies für diese Anwendung nicht der Fall ist. Wissen Sie, ob die Groß-/Kleinschreibung gilt, wenn auch die Header deklariert werden? z.B. wenn ich deklariere head = {'Content-type': ....}? Schätzen Sie die Hilfe! –

+0

Es scheint, dass die Header, die Sie deklarieren, durch das urllib Request-Objekt (nicht Python) in den Titel umgewandelt werden. Ich bin mir nicht sicher, ob es passiert, bevor die Anfrage an das Netzwerk gesendet wird, aber ich glaube nicht, dass es für den Server eine Rolle spielt. –

0

Check this out:

urllib2.py

def add_header(self, key, val): 
    # useful for something like authentication 
    self.headers[key.capitalize()] = val 

Jetzt Header seit Einstellung die gleiche ist add_header wie der Aufruf auf jedem von ihnen das sieht man, was passiert ist, dass urllib kapitalisiert jeder Schlüssel. So ist Ihre Kopfzeile unter genau diesem Schlüssel verfügbar: Content-type.

Fragen Sie mich nicht, warum das so gemacht wird. Ich habe keine Ahnung.

2

Header sind nicht angepasst case-insensitive. Die Header werden normalisierte hinzugefügt als aktivierte Strings (Anfangsbuchstaben in Großbuchstaben, Kleinbuchstaben Rest), so zum Testen Content-type Werke:

>>> list(req.headers) 
['Content-type', 'Connection', 'User-agent'] 
>>> req.has_header('Content-type') 
True 

Ja, das zu einfach ist, aber reicht für die interne Verwendung von Headern in dem Modul.

Verwandte Themen