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

前端 未结 3 1588
梦谈多话
梦谈多话 2020-12-28 22:46

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 fil

相关标签:
3条回答
  • 2020-12-28 23:20

    Building on Susam Pal's answer, here is my implementation which allows the port to be set (just like when you run python -m SimpleHTTPServer 8080) and also serves up html pages when the file exists on the file server, without the .html extension.

    #!/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()
    
    0 讨论(0)
  • 2020-12-28 23:23

    you should call your file index.html, that's the page that gets served automatically instead of listing the directory.

    the other possibility would be to override the handlers list_directory(self, path) method.

    0 讨论(0)
  • 2020-12-28 23:38

    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 -
    
    0 讨论(0)
提交回复
热议问题