2012-05-15 13 views
9

Wie zeige ich nur simplehttpwebsite_content.html an, wenn ich localhost:8080 besuche? Damit ich meinen Dateibaum nicht sehen kann, nur die Webseite. Alle diese Dateien befinden sich im selben Verzeichnis.Eine einfache Website mit Python mit SimpleHTTPServer und SocketServer, wie nur die HTML-Datei und nicht das gesamte Verzeichnis angezeigt werden?

simplehttpwebsite.py

#!/usr/bin/env python 
import SimpleHTTPServer 
import SocketServer 

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler 
server = SocketServer.TCPServer(('0.0.0.0', 8080), Handler) 

server.serve_forever() 

simplehttpwebsite_content.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html> 
    <head> 
    <link rel="stylesheet" type="text/css" href="simplehttpwebsite_style.css"> 
    </head> 

    <body> 
    This is my first web page 
    </body> 
</html> 

simplehttpwebsite_style.css

body{background-color:blue;} 

Antwort

20

Sie können SimpleHTTPServer.SimpleHTTPRequestHandler erweitern und außer Kraft setzen, die do_GET Methode self.path mit simplehttpwebpage_content.html zu ersetzen, wenn / angefordert wird.

#!/usr/bin/env python 
import SimpleHTTPServer 
import SocketServer 

class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_GET(self): 
     if self.path == '/': 
      self.path = '/simplehttpwebpage_content.html' 
     return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 

Handler = MyRequestHandler 
server = SocketServer.TCPServer(('0.0.0.0', 8080), Handler) 

server.serve_forever() 

Seit SimpleHTTPServer.SimpleHTTPRequestHandlerBaseHTTPServer.BaseHTTPRequestHandler erstreckt, können Sie ihre Dokumentationen lesen Abbildung, welche Methoden und Instanzvariablen zur Verfügung stehen und wie Sie sie manipulieren.

Die path Variable finden Sie in der Dokumentation von BaseHTTPServer.BaseHTTPRequestHandler. Sie finden die do_GET() Methode, die in der Dokumentation von SimpleHTTPServer.SimpleHTTPRequestHandler erwähnt wird.

Hier ist eine Ausgabe von meiner Schale zu zeigen, was passiert, wenn ich dieses Programm ausführen und dann http://localhost:8080/

[email protected]:~/so$ ls 
simplehttpwebpage_content.html simplehttpwebpage.py simplehttpwebsite_style.css 
[email protected]:~/so$ python simplehttpwebpage.py 
swift - - [19/Apr/2012 09:10:23] "GET/HTTP/1.1" 200 - 
swift - - [19/Apr/2012 09:10:26] "GET /simplehttpwebsite_style.css HTTP/1.1" 200 - 
+0

Ihre 'Rückkehr' ist nicht innerhalb der Funktion. Selbst wenn ich die return-Anweisung innerhalb der Funktion (Methode) platziere, bekomme ich einen 404 Error. – Bentley4

+0

Sorry Bentley4, das war ein Tippfehler. Ich habe es jetzt behoben. Siehst du Fehler in der Konsole, in der du 'python simplehttpwebpage.py' ausführst? Beachten Sie, dass sich 'similehttpwebpage_content.html' im selben Verzeichnis befinden muss, in dem Sie dieses Skript ausführen. –

+0

Ich schrieb simplewebsite_content.html anstelle von simplewebpage_content.html. :). Funktioniert jetzt. – Bentley4

10

Sie Ihre Datei index.html nennen sollte, das ist die Seite, die automatisch statt serviert wird von das Verzeichnis auflisten.

die andere Möglichkeit wäre, die Handler list_directory(self, path) Methode zu überschreiben.

+0

Ich verstehe nicht, warum jemand Ihre Antwort abgelehnt hat. Deine Antwort ist nützlich. – Bentley4

0

Aufbauend auf Susam Pal Antwort zuzugreifen ich versuche, hier ist meine Implementierung, die der Hafen sein erlaubt Set (wie wenn Sie python -m SimpleHTTPServer 8080 ausführen) und auch HTML-Seiten, wenn die Datei auf dem Dateiserver vorhanden ist, ohne die Erweiterung .html.

#!/usr/bin/env python 
import SimpleHTTPServer 
import SocketServer 
import os.path 
import sys 

class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_GET(self):    
     possible_name = self.path.strip("/")+'.html' 
     if self.path == '/': 
      # default routing, instead of "index.html" 
      self.path = '/simplehttpwebpage_content.html' 
     elif os.path.isfile(possible_name): 
      # extensionless page serving 
      self.path = possible_name 

     return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 

Handler = MyRequestHandler 

port = 8000 
if len(sys.argv) > 1: 
    try: 
     p = int(sys.argv[1]) 
     port = p 
    except ValueError: 
     print "port value provided must be an integer" 

print "serving on port {0}".format(port) 
server = SocketServer.TCPServer(('0.0.0.0', port), Handler) 
server.serve_forever() 
Verwandte Themen