web-dev-qa-db-ja.com

SimpleHTTPServerとSocketServerを使用したpythonの単純なWebサイト、ディレクトリ全体ではなくhtmlファイルのみを表示する方法は?

simplehttpwebsite_content.htmlにアクセスしたときにlocalhost:8080のみを表示するにはどうすればよいですか?ファイルツリーが表示されないように、Webページのみが表示されます。これらのファイルはすべて同じディレクトリにあります。

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

_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_ extends _BaseHTTPServer.BaseHTTPRequestHandler_ なので、ドキュメントを読んで、使用可能なメソッドとインスタンス変数、およびそれらを操作する方法を理解できます。

_BaseHTTPServer.BaseHTTPRequestHandler_ のドキュメントに記載されているpath変数を見つけることができます。 _SimpleHTTPServer.SimpleHTTPRequestHandler_ のドキュメントに記載されているdo_GET()メソッドを見つけることができます。

これは、このプログラムを実行してから_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 -
_
22
Susam Pal

ファイルを_index.html_と呼ぶ必要があります。これは、ディレクトリを一覧表示する代わりに自動的に提供されるページです。

他の可能性は、ハンドラーlist_directory(self, path)メソッドをオーバーライドすることです。

12
mata

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()
0
Kyle Falconer