A simple website with python using SimpleHTTPServer and SocketServer, how to only display the html file and not the whole directory?

html, networking, python

Solution

You can extend `SimpleHTTPServer.SimpleHTTPRequestHandler` and override the `do_GET` method to replace `self.path` with `simplehttpwebpage_content.html` if `/` is requested.

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

Since `SimpleHTTPServer.SimpleHTTPRequestHandler` extends `BaseHTTPServer.BaseHTTPRequestHandler`, you can read their documentations to figure what methods and instance variables are available and how you can manipulate them.

You can find the `path` variable mentioned in the documentation of `BaseHTTPServer.BaseHTTPRequestHandler`. You can find the `do_GET()` method mentioned in the documentation of `SimpleHTTPServer.SimpleHTTPRequestHandler`.

Here is some output from my shell to show what happens when I run this program and then I try to access `http://localhost:8080/`

susam@swift:~/so$ ls
simplehttpwebpage_content.html  simplehttpwebpage.py  simplehttpwebsite_style.css
susam@swift:~/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 -

Problem

How do I only display `simplehttpwebsite_content.html` when I visit `localhost:8080`? So that I can't see my filetree, only the webpage. All these files are in the same directory btw. 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;} ```

Original source