PythonにはWEB開発用の簡易HTTPサーバー機能が備わっています。
便利なのですが、公開したいディレクトリ直下に公開用スクリプトを置く必要がある(と思い込んでました)ため不便であり、公開ディレクトリを指定する方法を調べただけです。
結論
(Python3.7以上対応)
以下__DIRECTORYにスクリプトからの相対パスを__入れればOK。
参考1 より引用
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()
参考1
StackOverflow "How to run a http server which serves a specific path?"
私が知りたいことそのまま書いていた。
#コードの意味
公開ディレクトリを特に指定しない場合は、以下のようなコードでよい。自動的にスクリプトの存在するディレクトリが公開ディレクトリとなる。
TCPServer()にハンドラを引数として渡すことで、TCPServer()の中でSimpleHTTPRequestHandlerのコンストラクタに適切な引数を入れている。だからこの__Handlerは関数ポインタ__のようなイメージ。(つまり、それが"ハンドラ"か。)
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
で、上の結論のコードにおいて何をやっているかというとTCPServer()の中でSimpleHTTPRequestHandlerのコンストラクタを呼ぶという大枠は変えないで(以下のコードで言うところの*argsと**kwargs),
引数 directory に"任意の指定ディレクトリ"を渡すように__コンストラクタを上書き__している。
#SimpleHTTPRequestHandlerの初期化関数を再定義
class Handler(http.server.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=DIRECTORY, **kwargs)
#ほんとはこれがやりたいのだけど、引数足りないエラーになる。
#引数はTCPServer()の内部で適当に入れているから、ここでは入れられない&わからない。
Handler = http.server.SimpleHTTPRequestHandler(directory="web")
#これもだめ。当然だがargsってなんだよって言われる。
Handler = http.server.SimpleHTTPRequestHandler(*args,directory="web",**kwargs)
参考2
そう!やりたいのは以下のdirectoryに引数を入れたいだけなんだよ!
参考3
pythonで継承とsuper()を使って派生クラスをinitしてみよう
コンストラクタ上書きの部分がわからなくてお世話になりました。
Pythonの可変長引数(*args, **kwargs)の使い方
*argsのアスタリスクの意味が分からなくてお世話になりました。