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 namnenserver_name
ochserver_port
. Servern är åtkomlig för hanteraren, vanligtvis genom hanterarensserver
-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å vilkaHTTPServer
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 modulenssl
. Om modulenssl
inte är tillgänglig, misslyckas instantiering av ettHTTPSServer
-objekt med ettRuntimeError
.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ånThreadingMixIn
. Detta är analogt medThreadingHTTPServer
men använderHTTPSServer
.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 metodendo_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 inkluderarpath
härhier-part
ochquery
.
- 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. Funktionenparse_headers()
frånhttp.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 klassvariabelnserver_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ånresponses
baserat på den statuskod som skickades tillsend_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 korrektContent-Length
-rubrik (medsend_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 ärhttp.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 metodernasend_response_only()
ochsend_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ämpligado_*()
-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 en100 Continue
följt av200 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 skicka417 Expectation Failed
som svarshuvud ochreturn 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. Attributetresponses
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()
respektivedate_time_string()
. Om servern inte avser att skicka några andra rubriker med metodensend_header()
, börsend_response()
följas av ett anrop tillend_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()
ellerflush_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ÅSTEend_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 tilllog_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
ochsys_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 avtime.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 funktionernado_GET()
ochdo_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 motsvarandeGET
-begärande. Sedo_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
ellerindex.htm
(i den ordningen). Om den hittas returneras filens innehåll, annars genereras en kataloglista genom att anropa metodenlist_directory()
. Denna metod använderos.listdir()
för att skanna katalogen och returnerar ett404
-felsvar omlistdir()
misslyckas.Om begäran mappades till en fil öppnas den. Alla
OSError
-undantag vid öppnandet av den begärda filen mappas till ett404
,'Filen hittades inte'
-fel. Om det fanns en'If-Modified-Since'
header i begäran, och filen inte modifierades efter denna tid, skickas ett304
,Not Modified'
svar. I annat fall gissas innehållstypen genom anrop av metodenguess_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()
ochdo_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ägencgi_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 eftersomCGIHTTPRequestHandler
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.