2012-04-10 43 views
6

Muszę zaimplementować w Pythonie bardzo prostą aplikację podobną do serwera WWW, która będzie wykonywać podstawowe żądania HTTP i odpowiedzi oraz wyświetlać bardzo podstawowe dane wyjściowe na stronie internetowej. Nie jestem zbytnio zainteresowany faktycznym kodowaniem go w Pythonie, ale nie jestem pewien, od czego zacząć? Jak to ustawić? Jeden plik? Wiele plików? Chyba nie mam pojęcia, jak podejść do tego, że jest to "serwer" - więc nie mam pojęcia, jak podejść do obsługi żądań/gniazd HTTP/wniosków o przetwarzanie itd. Jakakolwiek rada? Zasoby?Jak mogę zaimplementować prosty serwer WWW przy użyciu Pythona bez korzystania z żadnych bibliotek?

+0

Wyjaśnij swoje wymagania (i dlaczego). Czy chcesz wdrożyć pełny stos na poziomie aplikacji, czy możesz użyć np. Apache? Wyjaśnij więcej, czego potrzebujesz * I dlaczego. * Wreszcie, kiedy masz tag "websocket", masz na myśli to czy był to tylko niepoprawny tag do użycia? –

+2

Bez używania * żadnych * bibliotek? Na pewno 'gniazdo' będzie wymagane na minimalnym poziomie? – geoffspear

+0

Sprawdź stronę [tę dokumentację] (http://docs.python.org/library/simplehttpserver.html), tutaj zakładam, że "dowolne biblioteki" to biblioteki, których nie ma w instalacji Pythona. –

Odpowiedz

2

Do tego celu można użyć socket programming. Poniższy urywek tworzy gniazda TCP i nasłuchuje na porcie 9000 dla żądań 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() 

Uruchom serwer, $ python server.py. Otwórz http://localhost:9000/ w przeglądarce internetowej (która działa jako klient). Następnie w oknie przeglądarki możesz zobaczyć tekst "Hello World" (odpowiedź http).

EDIT ** Powyższy kod został przetestowany tylko na chromie, a jak wy zasugerował innych przeglądarek, kod został zmodyfikowany jako:

  1. Aby odpowiedź http-alike można wysłać w zwykły nagłówek z wersją http 1.1, kod stanu 200 OK i tekst typu content/html.
  2. Gniazdo klienta musi zostać zamknięte po przesłaniu odpowiedzi, ponieważ jest to gniazdo TCP.
  3. Aby prawidłowo zamknąć gniazdo klienta, shutdown() musi być nazywany socket.shutdown vs socket.close

Następnie kod został przetestowany na Chrome, Firefox (http://localhost:9000/) oraz prosty pozwijane w terminalu (zwijają http://localhost:9000).

+2

-1. Czy próbowałeś tego? To w ogóle nie działa; jest to serwer gniazd, ale nie mówi HTTP. – Ashe

+3

W rzeczywistości nie mówi on po HTTP, więc prawie każda przeglądarka nie będzie z tym działać. To nie działa w Chrome. Działa tylko w przeglądarce Firefox po naciśnięciu przycisku Stop. To nie jest serwer WWW. – Ashe

+0

Skopiowałem twój skrypt, uruchomiłem go i dostaję komunikat, że 'wymagany jest obiekt bajtowy, a nie 'str'', jak to naprawić? – Simon

8

Powinieneś spojrzeć na moduł SimpleHttpServer (py3: http.server).

W zależności od tego, co próbujesz zrobić, możesz po prostu go użyć lub sprawdzić źródło modułu (py2, py3) w poszukiwaniu pomysłów.

Jeśli chcesz uzyskać więcej niskiego poziomu, SimpleHttpServer rozszerza BaseHttpServer (source), aby było po prostu działać.

Jeśli chcesz dostać nawet więcej niskim poziomie, spojrzeć na SocketServer (źródło: py2, py3).

Ludzie często uruchamiają pythona jak python -m SimpleHttpServer (lub python3 -m http.server), jeśli chcą tylko udostępnić katalog: to w pełni funkcjonalny i ... prosty serwer.

+0

Najprawdopodobniej powinieneś najpierw sprawdzić dokumentację HTTP. jak RFC. – zinking

Powiązane problemy