2012-04-10 11 views
6

Ho bisogno di implementare un'applicazione molto semplice simile a un server web in Python che esegua richieste e risposte HTTP di base e mostri output di base sulla pagina web. Non sono troppo preoccupato di codificarlo in Python, ma non sono sicuro da dove cominciare? Come impostare questo? Un file? Più file? Immagino di non avere idea di come affrontare il fatto che si tratta di un "server" - quindi non ho familiarità con il modo di affrontare le richieste HTTP/socket/richieste di elaborazione, ecc. Qualche consiglio? Risorse?Come posso implementare un semplice web server usando Python senza usare alcuna libreria?

+0

Spiega ulteriormente i tuoi requisiti (e perché). Stai cercando di implementare lo stack completo a livello di applicazione o puoi utilizzare ad es. Apache? Spiega di più di cosa hai bisogno * E perché. * Infine, quando hai il tag "websocket", intendi o è solo un tag errato da usare? –

+2

Senza usare * qualsiasi * librerie? Sicuramente 'socket' sta per essere richiesto al minimo? – geoffspear

+0

pagina [questa documentazione] (http://docs.python.org/library/simplehttpserver.html), qui presumo che "tutte le librerie" siano librerie che non sono incluse nell'installazione di python. –

risposta

2

È possibile utilizzare socket programming per questo scopo. Il seguente frammento crea un socket TCP e in ascolto sulla porta 9000 per le richieste http:

from socket import * 

def createServer(): 
    serversocket = socket(AF_INET, SOCK_STREAM) 
    serversocket.bind(('localhost',9000)) 
    serversocket.listen(5) 
    while(1): 
     (clientsocket, address) = serversocket.accept() 
     clientsocket.send("HTTP/1.1 200 OK\n" 
     +"Content-Type: text/html\n" 
     +"\n" # Important! 
     +"<html><body>Hello World</body></html>\n") 
     clientsocket.shutdown(SHUT_WR) 
     clientsocket.close() 

    serversocket.close() 

createServer() 

avviare il server, $ python server.py. Aprire http://localhost:9000/ nel browser Web (che funge da client). Quindi, nella finestra del browser, è possibile vedere il testo "Hello World" (risposta http).

EDIT ** Il codice precedente è stato testato solo su Chrome, e come voi ragazzi suggerito su altri browser, il codice è stato modificato come:

  1. per rendere la risposta HTTP-alike è possibile inviare in pianura intestazione con http versione 1.1, codice di stato 200 OK e content-type text/html.
  2. Il socket del client deve essere chiuso una volta inviata la risposta poiché si tratta di un socket TCP.
  3. Per chiudere correttamente il socket client, shutdown() deve essere chiamato socket.shutdown vs socket.close

Quindi il codice è stato testato su cromo, firefox (http://localhost:9000/) e semplice arricciatura terminale (arricciare http://localhost:9000).

+2

-1. Hai provato questo? Questo non funziona affatto; è un server socket, ma non parla HTTP. – Ashe

+3

In realtà non parla HTTP, quindi quasi tutti i browser non funzionano con questo. Non funziona in Chrome. Funziona solo su Firefox se si preme il pulsante Stop. Questo non è un server web. – Ashe

+0

Ho copiato il tuo script e l'errore è stato visualizzato dicendo che non è richiesto un oggetto simile a un byte e non un 'str'' come posso risolvere questo problema? – Simon

8

Si dovrebbe guardare il modulo SimpleHttpServer (py3: http.server).

A seconda di cosa si sta tentando di fare, è possibile utilizzarlo o controllare la fonte del modulo (py2, py3) per le idee.

Se si desidera ottenere un livello più basso, SimpleHttpServer estende BaseHttpServer (source) per farlo funzionare.

Se si desidera ottenere ancora di più di basso livello, dare un'occhiata a SocketServer (fonte: py2, py3).

Le persone eseguono spesso Python come python -m SimpleHttpServer (o python3 -m http.server) se vogliono solo condividere una directory: è un server completamente funzionale e ... semplice.

+0

Probabilmente direi che dovresti prima controllare la documentazione HTTP. come RFC. – zinking

Problemi correlati