http.server — HTTP-Server

Quellcode: Lib/http/server.py


Dieses Modul definiert Klassen zur Implementierung von HTTP-Servern.

Warnung

Die Verwendung von http.server wird für Produktionsumgebungen nicht empfohlen. Es implementiert nur grundlegende Sicherheitsüberprüfungen.

Verfügbarkeit: nicht WASI.

Dieses Modul funktioniert nicht oder ist nicht auf WebAssembly verfügbar. Weitere Informationen finden Sie unter WebAssembly-Plattformen.

Eine Klasse, HTTPServer, ist eine Unterklasse von socketserver.TCPServer. Sie erstellt und lauscht am HTTP-Socket und leitet die Anfragen an einen Handler weiter. Code zum Erstellen und Ausführen des Servers sieht wie folgt aus:

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
class http.server.HTTPServer(server_address, RequestHandlerClass)

Diese Klasse baut auf der Klasse TCPServer auf, indem sie die Serveradresse als Instanzvariablen namens server_name und server_port speichert. Der Server ist für den Handler zugänglich, typischerweise über die Instanzvariable server des Handlers.

class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

Diese Klasse ist identisch mit HTTPServer, verwendet aber Threads zur Bearbeitung von Anfragen durch die Verwendung von ThreadingMixIn. Dies ist nützlich, um von Webbrowsern vorab geöffnete Sockets zu handhaben, auf denen HTTPServer unendlich lange warten würde.

Hinzugefügt in Version 3.7.

class http.server.HTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

Unterklasse von HTTPServer mit einem umhüllten Socket, der das Modul ssl verwendet. Wenn das Modul ssl nicht verfügbar ist, schlägt die Instanziierung eines HTTPSServer-Objekts mit einem RuntimeError fehl.

Das Argument certfile ist der Pfad zur SSL-Zertifikatsketten-Datei, und keyfile ist der Pfad zur Datei, die den privaten Schlüssel enthält.

Ein password kann für mit PKCS#8 geschützte und umhüllte Dateien angegeben werden, aber seien Sie sich bewusst, dass dies möglicherweise hartkodierte Passwörter im Klartext preisgeben könnte.

Siehe auch

Siehe ssl.SSLContext.load_cert_chain() für zusätzliche Informationen zu den akzeptierten Werten für certfile, keyfile und password.

Wenn angegeben, muss das Argument alpn_protocols eine Sequenz von Strings sein, die die vom Server unterstützten „Application-Layer Protocol Negotiation“ (ALPN)-Protokolle angibt. ALPN ermöglicht es dem Server und dem Client, das Anwendungsprotokoll während des TLS-Handshakes auszuhandeln.

Standardmäßig ist es auf ["http/1.1"] gesetzt, was bedeutet, dass der Server HTTP/1.1 unterstützt.

Hinzugefügt in Version 3.14.

class http.server.ThreadingHTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

Diese Klasse ist identisch mit HTTPSServer, verwendet aber Threads zur Bearbeitung von Anfragen durch Vererbung von ThreadingMixIn. Dies ist analog zu ThreadingHTTPServer, das nur HTTPSServer verwendet.

Hinzugefügt in Version 3.14.

HTTPServer, ThreadingHTTPServer, HTTPSServer und ThreadingHTTPSServer müssen bei der Instanziierung eine RequestHandlerClass erhalten, wovon dieses Modul drei verschiedene Varianten bereitstellt:

class http.server.BaseHTTPRequestHandler(request, client_address, server)

Diese Klasse wird verwendet, um die beim Server eingehenden HTTP-Anfragen zu bearbeiten. An sich kann sie keine tatsächlichen HTTP-Anfragen beantworten; sie muss unterklassifiziert werden, um jede Anfrage-Methode (z. B. GET oder POST) zu behandeln. BaseHTTPRequestHandler stellt eine Reihe von Klassen- und Instanzvariablen sowie Methoden für die Verwendung durch Unterklassen bereit.

Der Handler parst die Anfrage und die Header und ruft dann eine Methode auf, die spezifisch für den Anfragetyp ist. Der Methodenname wird aus der Anfrage konstruiert. Zum Beispiel wird für die Anfrage-Methode SPAM die Methode do_SPAM() ohne Argumente aufgerufen. Alle relevanten Informationen werden in Instanzvariablen des Handlers gespeichert. Unterklassen müssen die Methode __init__() nicht überschreiben oder erweitern.

BaseHTTPRequestHandler hat die folgenden Instanzvariablen:

client_address

Enthält ein Tupel der Form (host, port), das sich auf die Adresse des Clients bezieht.

server

Enthält die Serverinstanz.

close_connection

Boolean, der vor der Rückgabe von handle_one_request() gesetzt werden sollte und angibt, ob eine weitere Anfrage erwartet werden kann oder ob die Verbindung geschlossen werden soll.

requestline

Enthält die String-Darstellung der HTTP-Anfragezeile. Das abschließende CRLF wird entfernt. Dieses Attribut sollte von handle_one_request() gesetzt werden. Wenn keine gültige Anfragezeile verarbeitet wurde, sollte es auf den leeren String gesetzt werden.

command

Enthält den Befehl (Anfragetyp). Zum Beispiel 'GET'.

path

Enthält den Anfragepfad. Wenn die Query-Komponente der URL vorhanden ist, dann enthält path die Query. Gemäß der Terminologie von RFC 3986 enthält path hier den hier-part und die query.

request_version

Enthält die Versionszeichenkette aus der Anfrage. Zum Beispiel 'HTTP/1.0'.

headers

Enthält eine Instanz der durch die Klassenvariable MessageClass spezifizierten Klasse. Diese Instanz parst und verwaltet die Header der HTTP-Anfrage. Die Funktion parse_headers() aus http.client wird zum Parsen der Header verwendet und erfordert, dass die HTTP-Anfrage einen gültigen Header im Stil von RFC 2822 bereitstellt.

rfile

Ein Eingabestrom vom Typ io.BufferedIOBase, der bereit ist, ab dem Anfang optionaler Eingabedaten zu lesen.

wfile

Enthält den Ausgabestrom zum Zurückschreiben einer Antwort an den Client. Zur erfolgreichen Interaktion mit HTTP-Clients muss bei der Ausgabe in diesen Strom eine ordnungsgemäße Einhaltung des HTTP-Protokolls erfolgen.

Geändert in Version 3.6: Dies ist ein Stream vom Typ io.BufferedIOBase.

BaseHTTPRequestHandler hat die folgenden Attribute:

server_version

Gibt die Server-Software-Version an. Sie können dies überschreiben. Das Format sind mehrere durch Leerzeichen getrennte Zeichenketten, wobei jede Zeichenkette die Form name[/version] hat. Zum Beispiel 'BaseHTTP/0.2'.

sys_version

Enthält die Python-Systemversion in einer Form, die von der Methode version_string und der Klassenvariable server_version verwendet werden kann. Zum Beispiel 'Python/1.4'.

error_message_format

Gibt eine Formatzeichenkette an, die von der Methode send_error() zum Erstellen einer Fehlerantwort an den Client verwendet werden sollte. Die Zeichenkette wird standardmäßig mit Variablen aus responses basierend auf dem an send_error() übergebenen Statuscode gefüllt.

error_content_type

Gibt den Content-Type-HTTP-Header von an den Client gesendeten Fehlerantworten an. Der Standardwert ist 'text/html'.

protocol_version

Gibt die HTTP-Version an, der der Server entspricht. Sie wird in Antworten gesendet, um dem Client die Kommunikationsfähigkeiten des Servers für zukünftige Anfragen mitzuteilen. Wenn auf 'HTTP/1.1' gesetzt, erlaubt der Server persistente HTTP-Verbindungen; Ihr Server **muss** dann jedoch einen genauen Content-Length-Header (mit send_header()) in allen seinen Antworten an Clients enthalten. Aus Kompatibilitätsgründen ist die Einstellung standardmäßig auf 'HTTP/1.0' gesetzt.

MessageClass

Gibt eine Klasse, die email.message.Message ähnelt, zum Parsen von HTTP-Headern an. Normalerweise wird dies nicht überschrieben und ist standardmäßig http.client.HTTPMessage.

responses

Dieses Attribut enthält eine Zuordnung von Fehlercode-Integern zu zweielementigen Tupeln, die eine kurze und eine lange Nachricht enthalten. Zum Beispiel {code: (shortmessage, longmessage)}. Die shortmessage wird normalerweise als message-Schlüssel in einer Fehlerantwort verwendet, und longmessage als explain-Schlüssel. Sie wird von den Methoden send_response_only() und send_error() verwendet.

Eine Instanz von BaseHTTPRequestHandler hat die folgenden Methoden:

handle()

Ruft handle_one_request() einmal (oder, wenn persistente Verbindungen aktiviert sind, mehrmals) auf, um eingehende HTTP-Anfragen zu bearbeiten. Sie müssen diese Methode nie überschreiben; implementieren Sie stattdessen geeignete do_*()-Methoden.

handle_one_request()

Diese Methode parst die Anfrage und leitet sie an die entsprechende do_*()-Methode weiter. Sie müssen diese Methode nie überschreiben.

handle_expect_100()

Wenn ein HTTP/1.1-konformer Server einen Expect: 100-continue-Anfrage-Header erhält, antwortet er mit einem 100 Continue, gefolgt von 200 OK-Headern. Diese Methode kann überschrieben werden, um einen Fehler auszulösen, wenn der Server nicht möchte, dass der Client fortfährt. Zum Beispiel kann der Server wählen, 417 Expectation Failed als Antwort-Header zu senden und return False zurückzugeben.

Hinzugefügt in Version 3.2.

send_error(code, message=None, explain=None)

Sendet und protokolliert eine vollständige Fehlerantwort an den Client. Der numerische code gibt den HTTP-Fehlercode an, wobei message eine optionale, kurze, menschenlesbare Beschreibung des Fehlers ist. Das Argument explain kann verwendet werden, um detailliertere Informationen über den Fehler bereitzustellen; es wird mit dem Attribut error_message_format formatiert und nach einem vollständigen Satz von Headern als Antwortkörper ausgegeben. Das Attribut responses enthält die Standardwerte für message und explain, die verwendet werden, wenn kein Wert angegeben wird; für unbekannte Codes ist der Standardwert für beide der String ???. Der Körper ist leer, wenn die Methode HEAD ist oder der Antwortcode einer der folgenden ist: 1xx, 204 No Content, 205 Reset Content, 304 Not Modified.

Geändert in Version 3.4: Die Fehlerantwort enthält einen Content-Length-Header. Das Argument explain wurde hinzugefügt.

send_response(code, message=None)

Fügt einen Antwort-Header zum Header-Puffer hinzu und protokolliert die akzeptierte Anfrage. Die HTTP-Antwortzeile wird in den internen Puffer geschrieben, gefolgt von den Headern Server und Date. Die Werte für diese beiden Header werden aus den Methoden version_string() und date_time_string() entnommen. Wenn der Server keine weiteren Header mit der Methode send_header() senden möchte, sollte auf send_response() ein Aufruf von end_headers() folgen.

Geändert in Version 3.3: Header werden in einem internen Puffer gespeichert und end_headers() muss explizit aufgerufen werden.

send_header(keyword, value)

Fügt den HTTP-Header einem internen Puffer hinzu, der in den Ausgabestrom geschrieben wird, wenn entweder end_headers() oder flush_headers() aufgerufen wird. keyword sollte den Header-Schlüssel angeben, und value dessen Wert. Beachten Sie, dass nach Abschluss der send_header-Aufrufe end_headers() UNBEDINGT aufgerufen werden MUSS, um den Vorgang abzuschließen.

Geändert in Version 3.2: Header werden in einem internen Puffer gespeichert.

send_response_only(code, message=None)

Sendet nur den Antwort-Header, was für den Fall verwendet wird, dass der Server dem Client eine 100 Continue-Antwort sendet. Die Header werden nicht gepuffert und direkt an den Ausgabestrom gesendet. Wenn message nicht angegeben ist, wird die der Antwort code entsprechende HTTP-Nachricht gesendet.

Hinzugefügt in Version 3.2.

end_headers()

Fügt eine Leerzeile (die das Ende der HTTP-Header in der Antwort anzeigt) zum Header-Puffer hinzu und ruft flush_headers() auf.

Geändert in Version 3.2: Die gepufferten Header werden in den Ausgabestrom geschrieben.

flush_headers()

Sendet die Header endgültig an den Ausgabestrom und leert den internen Header-Puffer.

Hinzugefügt in Version 3.3.

log_request(code='-', size='-')

Protokolliert eine akzeptierte (erfolgreiche) Anfrage. code sollte den numerischen HTTP-Code angeben, der der Antwort zugeordnet ist. Wenn die Größe der Antwort verfügbar ist, sollte sie als Parameter size übergeben werden.

log_error(...)

Protokolliert einen Fehler, wenn eine Anfrage nicht erfüllt werden kann. Standardmäßig wird die Nachricht an log_message() weitergeleitet, daher nimmt sie dieselben Argumente (format und zusätzliche Werte) entgegen.

log_message(format, ...)

Protokolliert eine beliebige Nachricht nach sys.stderr. Dies wird typischerweise überschrieben, um benutzerdefinierte Protokollierungsmechanismen für Fehler zu erstellen. Das Argument format ist eine standardmäßige printf-ähnliche Formatzeichenkette, an die die zusätzlichen Argumente für log_message() zur Formatierung übergeben werden. Die IP-Adresse des Clients und das aktuelle Datum und die aktuelle Uhrzeit werden jeder protokollierten Nachricht vorangestellt.

version_string()

Gibt die Versionszeichenkette der Serversoftware zurück. Dies ist eine Kombination der Attribute server_version und sys_version.

date_time_string(timestamp=None)

Gibt das Datum und die Uhrzeit zurück, die von timestamp (das None oder im Format von time.time() sein muss) angegeben werden, formatiert für einen Nachrichten-Header. Wenn timestamp weggelassen wird, wird das aktuelle Datum und die aktuelle Uhrzeit verwendet.

Das Ergebnis sieht wie folgt aus: 'Sun, 06 Nov 1994 08:49:37 GMT'.

log_date_time_string()

Gibt das aktuelle Datum und die aktuelle Uhrzeit zurück, formatiert für die Protokollierung.

address_string()

Gibt die Client-Adresse zurück.

Geändert in Version 3.3: Zuvor wurde eine Namensauflösung durchgeführt. Um Verzögerungen bei der Namensauflösung zu vermeiden, wird nun immer die IP-Adresse zurückgegeben.

class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)

Diese Klasse bedient Dateien aus dem Verzeichnis directory und darunter, oder dem aktuellen Verzeichnis, wenn directory nicht angegeben ist, und bildet die Verzeichnisstruktur direkt auf HTTP-Anfragen ab.

Geändert in Version 3.7: Der Parameter directory wurde hinzugefügt.

Geändert in Version 3.9: Der Parameter directory akzeptiert ein pfadähnliches Objekt.

Ein Großteil der Arbeit, wie z.B. das Parsen der Anfrage, wird von der Basisklasse BaseHTTPRequestHandler übernommen. Diese Klasse implementiert die Funktionen do_GET() und do_HEAD().

Die folgenden Attribute werden als Klassenattribute von SimpleHTTPRequestHandler definiert

server_version

Dies ist "SimpleHTTP/" + __version__, wobei __version__ auf Modulebene definiert ist.

extensions_map

Ein Dictionary, das Suffixe MIME-Typen zuordnet. Es enthält benutzerdefinierte Überschreibungen für die standardmäßigen Systemzuordnungen. Die Zuordnung wird case-insensitiv verwendet und sollte daher nur kleingeschriebene Schlüssel enthalten.

Geändert in Version 3.9: Dieses Dictionary wird nicht mehr mit den standardmäßigen Systemzuordnungen gefüllt, sondern enthält nur noch Überschreibungen.

Die Klasse SimpleHTTPRequestHandler definiert die folgenden Methoden

do_HEAD()

Diese Methode bedient den Anfragetyp 'HEAD': sie sendet die Header, die sie für eine entsprechende GET-Anfrage senden würde. Sehen Sie sich die Methode do_GET() für eine vollständigere Erklärung der möglichen Header an.

do_GET()

Die Anfrage wird einer lokalen Datei zugeordnet, indem die Anfrage als Pfad relativ zum aktuellen Arbeitsverzeichnis interpretiert wird.

Wenn die Anfrage einer Datei zugeordnet wurde, wird das Verzeichnis auf eine Datei namens index.html oder index.htm (in dieser Reihenfolge) überprüft. Wenn sie gefunden wird, werden die Inhalte der Datei zurückgegeben; andernfalls wird eine Verzeichnisliste generiert, indem die Methode list_directory() aufgerufen wird. Diese Methode verwendet os.listdir(), um das Verzeichnis zu scannen, und gibt eine Fehlermeldung 404 zurück, wenn listdir() fehlschlägt.

Wenn die Anfrage einer Datei zugeordnet wurde, wird diese geöffnet. Jede OSError-Ausnahme beim Öffnen der angeforderten Datei wird einer Fehlermeldung 404, 'File not found' zugeordnet. Wenn in der Anfrage ein Header 'If-Modified-Since' vorhanden war und die Datei seitdem nicht geändert wurde, wird eine Antwort 304, 'Not Modified' gesendet. Andernfalls wird der Inhaltstyp durch Aufruf der Methode guess_type() erraten, die wiederum die Variable extensions_map verwendet, und der Inhalt der Datei wird zurückgegeben.

Es wird ein Header 'Content-type:' mit dem erratenen Inhaltstyp ausgegeben, gefolgt von einem Header 'Content-Length:' mit der Dateigröße und einem Header 'Last-Modified:' mit der Änderungszeit der Datei.

Anschließend folgt eine Leerzeile, die das Ende der Header anzeigt, und dann wird der Inhalt der Datei ausgegeben.

Als Beispiel für die Verwendung siehe die Implementierung der Funktion test in Lib/http/server.py.

Geändert in Version 3.7: Unterstützung des Headers 'If-Modified-Since'.

Die Klasse SimpleHTTPRequestHandler kann auf folgende Weise verwendet werden, um einen sehr einfachen Webserver zu erstellen, der Dateien relativ zum aktuellen Verzeichnis bereitstellt

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

SimpleHTTPRequestHandler kann auch unterklassifiziert werden, um das Verhalten zu verbessern, z. B. durch die Verwendung anderer Index-Dateinamen durch Überschreiben des Klassenattributs index_pages.

class http.server.CGIHTTPRequestHandler(request, client_address, server)

Diese Klasse wird verwendet, um entweder Dateien oder die Ausgabe von CGI-Skripten aus dem aktuellen Verzeichnis und darunter bereitzustellen. Beachten Sie, dass die Abbildung der hierarchischen HTTP-Struktur auf die lokale Verzeichnisstruktur genau wie in SimpleHTTPRequestHandler erfolgt.

Hinweis

CGI-Skripte, die von der Klasse CGIHTTPRequestHandler ausgeführt werden, können keine Redirects (HTTP-Code 302) ausführen, da der Code 200 (Skriptausgabe folgt) vor der Ausführung des CGI-Skripts gesendet wird. Dies unterbricht den Statuscode.

Die Klasse führt jedoch das CGI-Skript aus, anstatt es als Datei bereitzustellen, wenn sie es als CGI-Skript errät. Es werden nur verzeichnisbasierte CGIs verwendet – die andere übliche Serverkonfiguration ist die Behandlung spezieller Erweiterungen als CGI-Skripte.

Die Funktionen do_GET() und do_HEAD() wurden modifiziert, um CGI-Skripte auszuführen und die Ausgabe bereitzustellen, anstatt Dateien bereitzustellen, wenn die Anfrage irgendwo unterhalb des Pfades cgi_directories liegt.

Die Klasse CGIHTTPRequestHandler definiert den folgenden Datenmember

cgi_directories

Dies ist standardmäßig ['/cgi-bin', '/htbin'] und beschreibt Verzeichnisse, die als Verzeichnisse mit CGI-Skripten behandelt werden sollen.

Die Klasse CGIHTTPRequestHandler definiert die folgende Methode

do_POST()

Diese Methode bedient den Anfragetyp 'POST', der nur für CGI-Skripte zulässig ist. Der Fehler 501, "Can only POST to CGI scripts", wird ausgegeben, wenn versucht wird, eine POST-Anfrage an eine Nicht-CGI-URL zu senden.

Beachten Sie, dass CGI-Skripte aus Sicherheitsgründen mit der UID des Benutzers nobody ausgeführt werden. Probleme mit dem CGI-Skript werden zu einem Fehler 403.

Veraltet seit Version 3.13, wird in Version 3.15 entfernt: CGIHTTPRequestHandler wird in 3.15 entfernt. CGI gilt seit über einem Jahrzehnt nicht mehr als gute Vorgehensweise. Dieser Code wird schon seit einiger Zeit nicht mehr gepflegt und findet kaum noch praktische Anwendung. Seine Beibehaltung könnte zu weiteren Sicherheitsüberlegungen führen.

Kommandozeilenschnittstelle

http.server kann auch direkt über den -m Schalter des Interpreters aufgerufen werden. Das folgende Beispiel zeigt, wie Dateien relativ zum aktuellen Verzeichnis bereitgestellt werden

python -m http.server [OPTIONS] [port]

Die folgenden Optionen werden akzeptiert:

port

Der Server hört standardmäßig auf Port 8000. Der Standardwert kann durch Angabe der gewünschten Portnummer als Argument überschrieben werden

python -m http.server 9000
-b, --bind <address>

Gibt eine bestimmte Adresse an, an die gebunden werden soll. Sowohl IPv4- als auch IPv6-Adressen werden unterstützt. Standardmäßig bindet sich der Server an alle Schnittstellen. Der folgende Befehl bewirkt beispielsweise, dass der Server nur an localhost gebunden wird

python -m http.server --bind 127.0.0.1

Hinzugefügt in Version 3.4.

Geändert in Version 3.8: IPv6-Unterstützung in der Option --bind.

-d, --directory <dir>

Gibt ein Verzeichnis an, aus dem die Dateien bereitgestellt werden sollen. Standardmäßig verwendet der Server das aktuelle Verzeichnis. Der folgende Befehl verwendet beispielsweise ein bestimmtes Verzeichnis

python -m http.server --directory /tmp/

Hinzugefügt in Version 3.7.

-p, --protocol <version>

Gibt die HTTP-Version an, der der Server entspricht. Standardmäßig entspricht der Server HTTP/1.0. Der folgende Befehl führt beispielsweise einen HTTP/1.1-konformen Server aus

python -m http.server --protocol HTTP/1.1

Hinzugefügt in Version 3.11.

--cgi

CGIHTTPRequestHandler kann über die Kommandozeile aktiviert werden, indem die Option --cgi übergeben wird

python -m http.server --cgi

Veraltet seit Version 3.13, wird in Version 3.15 entfernt: Die Kommandozeilenunterstützung --cgi für http.server wird entfernt, da CGIHTTPRequestHandler entfernt wird.

Warnung

CGIHTTPRequestHandler und die Kommandozeilenoption --cgi sind nicht für die Verwendung durch nicht vertrauenswürdige Clients bestimmt und können anfällig für Ausnutzung sein. Immer in einer sicheren Umgebung verwenden.

--tls-cert

Gibt eine TLS-Zertifikatskette für HTTPS-Verbindungen an

python -m http.server --tls-cert fullchain.pem

Hinzugefügt in Version 3.14.

--tls-key

Gibt eine private Schlüsseldatei für HTTPS-Verbindungen an.

Diese Option erfordert, dass --tls-cert angegeben wird.

Hinzugefügt in Version 3.14.

--tls-password-file

Gibt die Passwortdatei für passwortgeschützte private Schlüssel an

python -m http.server \
       --tls-cert cert.pem \
       --tls-key key.pem \
       --tls-password-file password.txt

Diese Option erfordert die Angabe von –tls-cert`.

Hinzugefügt in Version 3.14.

Sicherheitsüberlegungen

SimpleHTTPRequestHandler folgt symbolischen Links bei der Bearbeitung von Anfragen. Dies ermöglicht es, Dateien außerhalb des angegebenen Verzeichnisses bereitzustellen.

Frühere Versionen von Python bereinigten keine Steuerzeichen aus den Protokollnachrichten, die von python -m http.server oder der Standardimplementierung von .log_message in BaseHTTPRequestHandler an stderr gesendet wurden. Dies konnte dazu führen, dass entfernte Clients, die sich mit Ihrem Server verbinden, bösartige Steuerzeichen an Ihr Terminal senden konnten.

Geändert in Version 3.12: Steuerzeichen werden in stderr-Protokollen bereinigt.