Простой веб-сайт с python с помощью SimpleHTTPServer и SocketServer, как отображать только html-файл, а не весь каталог?

как я могу отображать только simplehttpwebsite_content.html когда я посещаю localhost:8080? Так что я не вижу свой файл, только веб-страницу. Все эти файлы находятся в одном каталоге 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;}

3 ответов


вы можете продлить SimpleHTTPServer.SimpleHTTPRequestHandler и переопределить do_GET способ заменить self.path С simplehttpwebpage_content.html если / запрос.

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

С SimpleHTTPServer.SimpleHTTPRequestHandler выходит BaseHTTPServer.BaseHTTPRequestHandler, вы можете прочитать их документы, чтобы понять, какие методы и переменные экземпляра доступны и как вы можете ими манипулировать.

вы можете найти path переменная, упомянутая в документации BaseHTTPServer.BaseHTTPRequestHandler. Вы можете найти do_GET() метод, упомянутый в документации SimpleHTTPServer.SimpleHTTPRequestHandler.

вот некоторые выходные данные из моей оболочки, чтобы показать, что происходит, когда я запускаю эту программу, а затем пытаюсь получить доступ 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 -

вы должны вызвать свой файл index.html, Это страница, которая обслуживается автоматически, а не перечисляет каталог.

другой возможностью было бы переопределить обработчики list_directory(self, path) метод.


основываясь на ответе Susam Pal, вот моя реализация, которая позволяет установить порт (так же, как при запуске python -m SimpleHTTPServer 8080), а также обслуживает html-страницы, когда файл существует на файловом сервере, без.расширение 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()