Ich würde sagen, es gibt keinen einfachen Weg, es zu tun, wo einfache Mittel „nur 1-2 Zeilen hinzufügen, die den zusätzlichen Header und halten die bestehende Funktionalität schreibt“. Die beste Lösung wäre also, die Klasse SimpleHTTPRequestHandler
zu unterklassifizieren und die Funktionalität mit dem neuen Header neu zu implementieren.
Das Problem hinter warum gibt es keine einfache Möglichkeit, dies zu tun, kann durch einen Blick auf die Umsetzung der SimpleHTTPRequestHandler
Klasse in der Python-Bibliothek zu beachten: http://hg.python.org/cpython/file/19c74cadea95/Lib/http/server.py#l654
Beachten Sie die send_head()
Verfahren, insbesondere die Linien am Ende die Methode, die die Antwortheader sendet. Beachten Sie den Aufruf der Methode end_headers()
. Diese Methode schreibt die Header an den Ausgang, zusammen mit einer Leerzeile, die signalisiert das Ende aller Header und den Beginn des Antworttextes: http://docs.python.org/py3k/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers
Daher wäre es nicht möglich sein, die SimpleHTTPRequestHandler
Handler Unterklasse, rufen Sie die Super -klasse do_GET()
Methode, und dann einfach einen weiteren Header hinzufügen - weil das Senden der Header bereits beendet ist, wenn der Aufruf der Super-Klasse do_GET()
Methode zurückgibt. Und es muss so arbeiten, weil die do_GET()
Methode den Körper (die Datei, die angefordert wird) senden muss, und den Körper zu senden - es muss das Senden der Überschriften abschließen.
Also, noch einmal, ich glaube, Sie mit Sub-Klassierung der SimpleHTTPRequestHandler
Klasse stecken, ist es genau so, wie der Code in der Bibliothek, die (nur kopieren und einfügen?), Und einen anderen Header vor dem Aufruf der end_headers()
hinzufügen Verfahren in send_head()
:
...
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
# this below is the new header
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
return f
...
Vergessen Sie auch nicht, die Header zu senden, wenn Sie do_GET neu definieren: 'def do_GET (self): self.send_head()' – user474708
Diese Lösung funktioniert nicht, wenn Sie den Standardwert do_GET() verwenden. Es ruft nicht end_headers auf. – Koffiman