2012-05-15 12 views
9

¿Cómo solo visualizo simplehttpwebsite_content.html cuando visito localhost:8080? Para que no pueda ver mi archivo de archivo, solo la página web. Todos estos archivos están en el mismo directorio por cierto.Un sitio web simple con Python que utiliza SimpleHTTPServer y SocketServer, ¿cómo solo mostrar el archivo html y no todo el directorio?

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;} 

Respuesta

20

Puede extender SimpleHTTPServer.SimpleHTTPRequestHandler y reemplazar el método do_GET para reemplazar self.path con simplehttpwebpage_content.html si se solicita /.

#!/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() 

Desde SimpleHTTPServer.SimpleHTTPRequestHandler se extiende BaseHTTPServer.BaseHTTPRequestHandler, puede leer sus documentaciones para averiguar qué métodos y variables de instancia están disponibles y cómo se pueden manipular.

Puede encontrar la variable path mencionada en la documentación de BaseHTTPServer.BaseHTTPRequestHandler. Puede encontrar el método do_GET() mencionado en la documentación de SimpleHTTPServer.SimpleHTTPRequestHandler.

Aquí es un poco de salida de mi caparazón para mostrar lo que sucede cuando ejecuto este programa y luego intento acceder a 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

Su 'devolución' no está dentro de la función. Incluso cuando coloco la declaración return dentro de la función (método) obtengo un error 404. – Bentley4

+0

Lo siento Bentley4, eso fue un error tipográfico. Lo he arreglado ahora. ¿Ve algún error en la consola donde está ejecutando 'python simplehttpwebpage.py'? Tenga en cuenta que 'simplehttpwebpage_content.html' debe estar en el mismo directorio en el que está ejecutando este script. –

+0

Escribí simplewebsite_content.html en lugar de simplewebpage_content.html. :). Funciona ahora – Bentley4

10

debe llamar a su archivo index.html, que es la página que se obtiene sirvió automáticamente en lugar de listando el directorio.

la otra posibilidad sería anular el método de los manipuladores list_directory(self, path).

+0

No entiendo por qué alguien rechazó su respuesta. Tu respuesta es útil. – Bentley4

0

Sobre la base de la respuesta de Susam Pal, aquí está mi aplicación que permite que el puerto sea establecer (al igual que cuando ejecuta python -m SimpleHTTPServer 8080) y también sirve páginas html cuando el archivo existe en el servidor de archivos, sin la extensión .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() 
Cuestiones relacionadas