1. ホーム
  2. python

[解決済み] 特定のパスでサービスを提供するhttpサーバーを実行するには?

2023-01-30 10:54:52

質問

これは私のPython3プロジェクトの階層構造です。

projet
  \
  script.py
  web
    \
    index.html

から script.py の内容を提供する http サーバを走らせたいと思います。 web フォルダの内容を提供するために、http サーバーを実行したいと思います。

ここで は、簡単なhttpサーバーを実行するために、このコードを示唆している。

import http.server
import socketserver

PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()

が、これは実際には project ではなく web . 提供したいフォルダのパスを指定するにはどうしたらよいでしょうか?

どのように解決するのですか?

Python 3.7では SimpleHTTPRequestHandler を取ることができます。 directory 引数 :

import http.server
import socketserver

PORT = 8000
DIRECTORY = "web"


class Handler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=DIRECTORY, **kwargs)


with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

とコマンドラインから

python -m http.server --directory web


少しクレイジーになりますが...任意のディレクトリのハンドラを作成することができます。

def handler_from(directory):
    def _init(self, *args, **kwargs):
        return http.server.SimpleHTTPRequestHandler.__init__(self, *args, directory=self.directory, **kwargs)
    return type(f'HandlerFrom<{directory}>',
                (http.server.SimpleHTTPRequestHandler,),
                {'__init__': _init, 'directory': directory})


with socketserver.TCPServer(("", PORT), handler_from("web")) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()