http.server — HTTP-servrar

Källkod: Lib/http/server.py


Denna modul definierar klasser för implementering av HTTP-servrar.

Varning

http.server rekommenderas inte för produktion. Den implementerar endast grundläggande säkerhetskontroller.

Tillgänglighet: not WASI.

Den här modulen fungerar inte eller är inte tillgänglig på WebAssembly. Se WebAssembly-plattformar för mer information.

En klass, HTTPServer, är en socketserver.TCPServer-underklass. Den skapar och lyssnar på HTTP-sockeln och skickar förfrågningarna till en hanterare. Koden för att skapa och köra servern ser ut så här:

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)

Den här klassen bygger på klassen TCPServer genom att lagra serveradressen som instansvariabler med namnen server_name och server_port. Servern är åtkomlig för hanteraren, vanligtvis genom hanterarens server-instansvariabel.

class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

Den här klassen är identisk med HTTPServer men använder trådar för att hantera förfrågningar genom att använda ThreadingMixIn. Detta är användbart för att hantera webbläsare som föröppnar socklar, på vilka HTTPServer skulle vänta på obestämd tid.

Tillagd i version 3.7.

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

Underklass till HTTPServer med en omsluten socket som använder modulen ssl. Om modulen ssl inte är tillgänglig, misslyckas instantiering av ett HTTPSServer-objekt med ett RuntimeError.

Argumentet certfile är sökvägen till filen med SSL-certifikatkedjan och keyfile är sökvägen till filen med den privata nyckeln.

Ett lösenord kan anges för filer som skyddas och omsluts av PKCS#8, men tänk på att detta eventuellt kan exponera hårdkodade lösenord i klartext.

Se även

Se ssl.SSLContext.load_cert_chain() för ytterligare information om de accepterade värdena för certfile, keyfile och password.

När det anges måste argumentet alpn_protocols vara en sekvens av strängar som anger de ALPN-protokoll (Application-Layer Protocol Negotiation) som stöds av servern. ALPN gör det möjligt för servern och klienten att förhandla om applikationsprotokollet under TLS-handskakningen.

Som standard är den inställd på ["http/1.1"], vilket innebär att servern stöder HTTP/1.1.

Tillagd i version 3.14.

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

Denna klass är identisk med HTTPSServer men använder trådar för att hantera förfrågningar genom att ärva från ThreadingMixIn. Detta är analogt med ThreadingHTTPServer men använder HTTPSServer.

Tillagd i version 3.14.

HTTPServer, ThreadingHTTPServer, HTTPSServer och ThreadingHTTPSServer måste ges en RequestHandlerClass vid instantiering, som denna modul tillhandahåller tre olika varianter av:

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

Den här klassen används för att hantera HTTP-förfrågningar som kommer till servern. I sig själv kan den inte svara på några faktiska HTTP-förfrågningar; den måste underklassas för att hantera varje förfrågningsmetod (t.ex. GET eller POST). BaseHTTPRequestHandler tillhandahåller ett antal klass- och instansvariabler och metoder för användning av underklasser.

Hanteraren analyserar begäran och sidhuvudet och anropar sedan en metod som är specifik för begärandetypen. Metodnamnet konstrueras utifrån begäran. Till exempel, för begärandemetoden SPAM kommer metoden do_SPAM`() att anropas utan argument. All relevant information lagras i hanterarens instansvariabler. Underklasser ska inte behöva åsidosätta eller utöka metoden __init__().

BaseHTTPRequestHandler har följande instansvariabler:

client_address

Innehåller en tupel av formen (host, port) som hänvisar till klientens adress.

server

Innehåller serverinstansen.

close_connection

Boolean som ska anges innan handle_one_request() returneras, vilket indikerar om en annan begäran kan väntas eller om anslutningen ska stängas av.

requestline

Innehåller en strängrepresentation av HTTP-begärans rad. Det avslutande CRLF är borttaget. Detta attribut bör sättas av handle_one_request(). Om ingen giltig request-rad behandlades, bör det sättas till den tomma strängen.

command

Innehåller kommandot (typ av begäran). Till exempel 'GET'.

path

Innehåller sökvägen till begäran. Om query-komponenten i URL:en finns med, innehåller path även query. Med terminologin i RFC 3986 inkluderar path här hier-part och query.

request_version

Innehåller versionssträngen från begäran. Till exempel, 'HTTP/1.0'.

headers

Innehåller en instans av den klass som anges av klassvariabeln MessageClass. Denna instans analyserar och hanterar rubrikerna i HTTP-begäran. Funktionen parse_headers() från http.client används för att analysera rubrikerna och den kräver att HTTP-begäran innehåller en giltig rubrik av typen RFC 2822.

rfile

En io.BufferedIOBase inmatningsström, redo att läsas från början av de valfria inmatningsdata.

wfile

Innehåller utdataströmmen för att skriva ett svar tillbaka till klienten. HTTP-protokollet måste följas när du skriver till den här strömmen för att du ska få ett bra samspel med HTTP-klienter.

Ändrad i version 3.6: Detta är en io.BufferedIOBase-ström.

BaseHTTPRequestHandler har följande attribut:

server_version

Anger serverns programvaruversion. Du kanske vill åsidosätta detta. Formatet är flera strängar separerade med blanksteg, där varje sträng är av formen name[/version]. Till exempel 'BaseHTTP/0.2'.

sys_version

Innehåller Python-systemets version, i en form som kan användas med metoden version_string och klassvariabeln server_version. Till exempel 'Python/1.4'.

error_message_format

Anger en formatsträng som ska användas av metoden send_error() för att bygga upp ett felsvar till klienten. Strängen fylls som standard med variabler från responses baserat på den statuskod som skickades till send_error().

error_content_type

Anger HTTP-huvudet Content-Type för felsvar som skickas till klienten. Standardvärdet är 'text/html'.

protocol_version

Anger vilken HTTP-version som servern är kompatibel med. Den skickas i svar för att klienten ska få veta serverns kommunikationsmöjligheter för framtida förfrågningar. Om inställningen är 'HTTP/1.1' tillåter servern permanenta HTTP-anslutningar, men din server måste då inkludera en korrekt Content-Length-rubrik (med send_header()) i alla sina svar till klienter. För bakåtkompatibilitet är standardinställningen 'HTTP/1.0'.

MessageClass

Anger en email.message.Message -liknande klass för att analysera HTTP-rubriker. Vanligtvis åsidosätts inte detta, och standardvärdet är http.client.HTTPMessage.

responses

Detta attribut innehåller en mappning av heltal för felkoder till tupler med två element som innehåller ett kort och ett långt meddelande. Till exempel {kod: (kortmeddelande, långtmeddelande)}. shortmessage används vanligtvis som message-nyckel i ett felsvar, och longmessage som explain-nyckel. Den används av metoderna send_response_only() och send_error().

En BaseHTTPRequestHandler-instans har följande metoder:

handle()

Anropar handle_one_request() en gång (eller, om ihållande anslutningar är aktiverade, flera gånger) för att hantera inkommande HTTP-förfrågningar. Du bör aldrig behöva åsidosätta den; implementera istället lämpliga do_*()-metoder.

handle_one_request()

Den här metoden analyserar och skickar begäran till lämplig do_*()-metod. Du bör aldrig behöva åsidosätta den.

handle_expect_100()

När en HTTP/1.1-konform server tar emot en Expect: 100-continue request header svarar den tillbaka med en 100 Continue följt av 200 OK headers. Denna metod kan åsidosättas så att den ger upphov till ett fel om servern inte vill att klienten ska fortsätta. Servern kan t.ex. välja att skicka 417 Expectation Failed som svarshuvud och return False.

Tillagd i version 3.2.

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

Skickar och loggar ett fullständigt felsvar till klienten. Den numeriska code anger HTTP-felkoden, med message som en valfri, kort, mänskligt läsbar beskrivning av felet. Argumentet explain kan användas för att ge mer detaljerad information om felet; det kommer att formateras med attributet error_message_format och skickas ut, efter en komplett uppsättning rubriker, som svarskropp. Attributet responses innehåller standardvärdena för message och explain som kommer att användas om inget värde anges; för okända koder är standardvärdet för båda strängen ???. Body kommer att vara tom om metoden är HEAD eller om svarskoden är någon av följande: 1xx, 204 No Content, 205 Reset Content, 304 Not Modified.

Ändrad i version 3.4: Felmeddelandet innehåller en Content-Length-rubrik. Argumentet explain har lagts till.

send_response(code, message=None)

Lägger till en svarsrubrik i bufferten för rubriker och loggar den accepterade begäran. HTTP-svarsraden skrivs till den interna bufferten, följt av rubrikerna Server och Date. Värdena för dessa två rubriker hämtas från metoderna version_string() respektive date_time_string(). Om servern inte avser att skicka några andra rubriker med metoden send_header(), bör send_response() följas av ett anrop till end_headers().

Ändrad i version 3.3: Headers lagras i en intern buffert och end_headers() måste anropas explicit.

send_header(keyword, value)

Lägger till HTTP-headern i en intern buffert som skrivs till utdataströmmen när antingen end_headers() eller flush_headers() aktiveras. keyword bör ange nyckelordet för rubriken, med value som anger dess värde. Observera att efter att send_header-anropen har gjorts MÅSTE end_headers() anropas för att slutföra operationen.

Ändrad i version 3.2: Huvudrubrikerna lagras i en intern buffert.

send_response_only(code, message=None)

Skickar endast svarshuvudet, som används när svaret 100 Continue skickas från servern till klienten. Rubrikerna buffras inte utan skickas direkt till utdataströmmen. Om message inte anges skickas det HTTP-meddelande som motsvarar svarets code.

Tillagd i version 3.2.

end_headers()

Lägger till en tom rad (som anger slutet på HTTP-rubrikerna i svaret) i rubrikbufferten och anropar flush_headers().

Ändrad i version 3.2: De buffrade sidhuvudena skrivs till utdataströmmen.

flush_headers()

Slutligen skickas rubrikerna till utdataströmmen och den interna bufferten för rubriker töms.

Tillagd i version 3.3.

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

Loggar en accepterad (lyckad) begäran. code bör ange den numeriska HTTP-kod som är associerad med svaret. Om en storlek på svaret är tillgänglig, ska den skickas som parametern size.

log_error(...)

Loggar ett felmeddelande när en begäran inte kan uppfyllas. Som standard skickas meddelandet till log_message(), så det tar samma argument (format och ytterligare värden).

log_message(format, ...)

Loggar ett godtyckligt meddelande till sys.stderr. Detta åsidosätts vanligen för att skapa egna mekanismer för felloggning. Argumentet format är en standardformatsträng i printf-stil, där de ytterligare argumenten till log_message() används som input till formateringen. Klientens ip-adress och aktuellt datum och tid prefixeras till varje loggat meddelande.

version_string()

Returnerar serverprogramvarans versionssträng. Detta är en kombination av attributen server_version och sys_version.

date_time_string(timestamp=None)

Returnerar datum och tid som anges av timestamp (som måste vara None eller i det format som returneras av time.time()), formaterat för ett meddelandehuvud. Om timestamp utelämnas används aktuellt datum och aktuell tid.

Resultatet ser ut som 'Sun, 06 Nov 1994 08:49:37 GMT'.

log_date_time_string()

Returnerar aktuellt datum och tid, formaterat för loggning.

address_string()

Returnerar klientadressen.

Ändrad i version 3.3: Tidigare gjordes en namnuppslagning. För att undvika fördröjningar i namnupplösningen returneras nu alltid IP-adressen.

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

Den här klassen serverar filer från katalogen directory och nedåt, eller den aktuella katalogen om directory inte anges, och mappar katalogstrukturen direkt till HTTP-begäranden.

Ändrad i version 3.7: Parametern directory har lagts till.

Ändrad i version 3.9: Parametern directory accepterar en path-like object.

En stor del av arbetet, t.ex. parsning av begäran, görs av basklassen BaseHTTPRequestHandler. Denna klass implementerar funktionerna do_GET() och do_HEAD().

Följande är definierade som attribut på klassnivå för SimpleHTTPRequestHandler:

server_version

Detta kommer att vara "SimpleHTTP/" + __version__, där __version__ definieras på modulnivå.

extensions_map

En ordbok som mappar suffix till MIME-typer, innehåller anpassade åsidosättningar för systemets standardmappningar. Mappningen används utan hänsyn till skiftlägesskillnader och bör därför endast innehålla nycklar med gemener.

Ändrad i version 3.9: Denna ordbok är inte längre fylld med systemets standardmappningar, utan innehåller endast åsidosättningar.

Klassen SimpleHTTPRequestHandler definierar följande metoder:

do_HEAD()

Denna metod betjänar 'HEAD'-begärandetypen: den skickar de rubriker som den skulle skicka för motsvarande GET-begärande. Se do_GET()-metoden för en mer fullständig förklaring av de möjliga rubrikerna.

do_GET()

Begäran mappas till en lokal fil genom att tolka begäran som en sökväg i förhållande till den aktuella arbetskatalogen.

Om begäran mappades till en katalog, kontrolleras om katalogen innehåller en fil med namnet index.html eller index.htm (i den ordningen). Om den hittas returneras filens innehåll, annars genereras en kataloglista genom att anropa metoden list_directory(). Denna metod använder os.listdir() för att skanna katalogen och returnerar ett 404-felsvar om listdir() misslyckas.

Om begäran mappades till en fil öppnas den. Alla OSError-undantag vid öppnandet av den begärda filen mappas till ett 404, 'Filen hittades inte'-fel. Om det fanns en 'If-Modified-Since' header i begäran, och filen inte modifierades efter denna tid, skickas ett 304, Not Modified' svar. I annat fall gissas innehållstypen genom anrop av metoden guess_type(), som i sin tur använder variabeln extensions_map, och filinnehållet returneras.

En 'Content-type:' header med den gissade innehållstypen matas ut, följt av en 'Content-Length:' header med filens storlek och en 'Last-Modified:' header med filens ändringstid.

Därefter följer en tom rad som markerar slutet på sidhuvudet och sedan matas innehållet i filen ut.

För exempel på användning, se implementeringen av funktionen test i Lib/http/server.py.

Ändrad i version 3.7: Stöd för rubriken 'If-Modified-Since'.

Klassen SimpleHTTPRequestHandler kan användas på följande sätt för att skapa en mycket enkel webbserver som serverar filer i förhållande till den aktuella katalogen:

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 kan också underklassificeras för att förbättra beteendet, t.ex. genom att använda olika indexfilnamn genom att åsidosätta klassattributet index_pages.

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

Denna klass används för att servera antingen filer eller utdata från CGI-skript från den aktuella katalogen och nedåt. Observera att mappning av HTTP-hierarkisk struktur till lokal katalogstruktur är exakt som i SimpleHTTPRequestHandler.

Anteckning

CGI-skript som körs av CGIHTTPRequestHandler-klassen kan inte utföra omdirigeringar (HTTP-kod 302), eftersom kod 200 (skriptutdata följer) skickas innan CGI-skriptet körs. Detta föregår statuskoden.

Klassen kommer dock att köra CGI-skriptet, istället för att servera det som en fil, om den gissar att det är ett CGI-skript. Endast katalogbaserade CGI används — den andra vanliga serverkonfigurationen är att behandla speciella tillägg som betecknar CGI-skript.

Funktionerna do_GET() och do_HEAD() är modifierade så att de kör CGI-skript och serverar utdata i stället för att servera filer om begäran leder till en plats under sökvägen cgi_directories.

Klassen CGIHTTPRequestHandler definierar följande datamedlem:

cgi_directories

Standardvärdet är ['/cgi-bin', '/htbin'] och beskriver kataloger som ska behandlas som innehållande CGI-skript.

CGIHTTPRequestHandler definierar följande metod:

do_POST()

Denna metod serverar begärandetypen 'POST, som endast är tillåten för CGI-skript. Fel 501, ”Can only POST to CGI scripts”, visas när man försöker POSTa till en url som inte är CGI.

Observera att CGI-skript kommer att köras med UID för användaren nobody, av säkerhetsskäl. Problem med CGI-skriptet kommer att översättas till fel 403.

Deprecated since version 3.13, will be removed in version 3.15: CGIHTTPRequestHandler kommer att tas bort i 3.15. CGI har inte ansetts vara ett bra sätt att göra saker på över ett decennium. Den här koden har inte underhållits på ett tag nu och har mycket liten praktisk användning. Att behålla den kan leda till ytterligare säkerhetsöverväganden.

Kommandoradsgränssnitt

http.server kan också anropas direkt med hjälp av -m i tolken. Följande exempel illustrerar hur man serverar filer i förhållande till den aktuella katalogen:

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

Följande alternativ accepteras:

port

Servern lyssnar på port 8000 som standard. Standardinställningen kan åsidosättas genom att ange önskat portnummer som ett argument:

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

Anger en specifik adress som den ska binda till. Både IPv4- och IPv6-adresser stöds. Som standard binder servern sig till alla gränssnitt. Följande kommando gör t.ex. att servern endast binder till localhost:

python -m http.server --bind 127.0.0.1

Tillagd i version 3.4.

Ändrad i version 3.8: Stöd för IPv6 i alternativet --bind.

-d, --directory <dir>

Anger en katalog till vilken filerna ska skickas. Som standard använder servern den aktuella katalogen. Följande kommando använder t.ex. en viss katalog:

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

Tillagd i version 3.7.

-p, --protocol <version>

Anger den HTTP-version som servern är kompatibel med. Som standard är servern kompatibel med HTTP/1.0. Följande kommando kör t.ex. en HTTP/1.1-konform server:

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

Tillagd i version 3.11.

--cgi

CGIHTTPRequestHandler kan aktiveras på kommandoraden genom att ange alternativet --cgi:

python -m http.server --cgi

Deprecated since version 3.13, will be removed in version 3.15: http.server command line --cgi support tas bort eftersom CGIHTTPRequestHandler tas bort.

Varning

CGIHTTPRequestHandler och kommandoradsalternativet --cgi är inte avsedda att användas av icke betrodda klienter och kan vara sårbara för exploatering. Använd alltid inom en säker miljö.

--tls-cert

Anger en TLS-certifikatkedja för HTTPS-anslutningar:

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

Tillagd i version 3.14.

--tls-key

Anger en privat nyckelfil för HTTPS-anslutningar.

Detta alternativ kräver att --tls-cert anges.

Tillagd i version 3.14.

--tls-password-file

Anger lösenordsfilen för lösenordsskyddade privata nycklar:

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

Detta alternativ kräver att –tls-cert anges.

Tillagd i version 3.14.

Överväganden om säkerhet

SimpleHTTPRequestHandler kommer att följa symboliska länkar vid hantering av förfrågningar, vilket gör det möjligt för filer utanför den angivna katalogen att serveras.

Tidigare versioner av Python rensade inte bort kontrolltecken från loggmeddelanden som sändes till stderr från python -m http.server eller standardimplementationen BaseHTTPRequestHandler .log_message. Detta kan göra det möjligt för fjärrklienter som ansluter till din server att skicka skumma kontrollkoder till din terminal.

Ändrad i version 3.12: Kontrolltecken rensas bort i stderr-loggar.