たった数行で作るWebサーバー【Python x HTTPServer】

Webサーバーを作る最小限のプログラム
Pythonで簡易的なWebサーバーをたてられる
HTTPServer
の使い方・プログラミングを解説していきます(Python
3.9.4で動かします)。
from http.server import HTTPServer, SimpleHTTPRequestHandler
= "0.0.0.0"
ip = 8887
port
= HTTPServer(('', port), SimpleHTTPRequestHandler)
httpd httpd.serve_forever()
はい、とても簡単ですね。 http://0.0.0.0:8887
へブラウザからアクセスできます。
ですが、このままだと httpd.serve_forever()
で止まってしまい、それ移行のプログラムは実行されません。そこでPythonのスレッドをつかってサーバーを実行してみます。
PythonでHTTPサーバーをスレッドで動かす
こんな感じです。
import threading
from http.server import HTTPServer, SimpleHTTPRequestHandler
= "../html" # HTMLが格納されているディレクトリ
html_root
class Handler(SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, directory=html_root, **kwargs)
def log_message(self, format, *args):
pass # ログ出力を無視
def begin_dummy_server():
= "0.0.0.0"
ip = 8887
port
= HTTPServer(('', port), Handler)
httpd print('HTTPServer began -> http://{}:{}'.format(ip, port))
= threading.Thread(target=httpd.serve_forever) # スレッドで動かす
server_thread
server_thread.start()
if __name__ == "__main__":
begin_dummy_server()print("hoge")
次の部分でスレッド登録させてます。
= threading.Thread(target=httpd.serve_forever)
server_thread server_thread.start()
threadingをインポートして、対象となる関数を
target
に登録&スタートさせればOKです。
HTMLディレクトリを指定したい
SimpleHTTPRequestHandler
を継承したハンドラーを使うことでHTMLファイルが格納されているディレクトリを指定できます。SimpleHTTPRequestHandler
のコンストラクターで、directory=
引数にディレクトリを指定します。
ログを非表示にしたい
サーバーへアクセスするとターミナルにいちいちログが出力されますが、ログを出力したくない場合は上のプログラムのとおり、
log_message
をオーバーライドして pass
させます。
自分のLAN IPアドレスを取得する
HTTPServer
とは直接関係ありませんが、LAN内の端末からWebサーバーへアクセスしたい場合にIPアドレスを表示できると便利です。macOS上で実行するPythonでは、次のようにするとLAN内の自分のIPアドレスを取得できます。
import socket
= socket.gethostbyname_ex(socket.gethostname())
host_list = host_list[2][1] lan_address
ただし、PCにファイアーウォールがかかってるとアクセスできませんのでご注意ください。
リクエストされたヘッダーを表示したい
リクエストヘッダーを詳細に見たい場合があります。そんな時は
do_GET
をオーバライドして、 logging
で標準出力させます。POSTデータの場合は do_POST
も同様に追加してください。
from http.server import HTTPServer, SimpleHTTPRequestHandler
import socket
import logging
=logging.INFO)
logging.basicConfig(level= logging.getLogger(__name__)
logger
= socket.gethostbyname_ex(socket.gethostname())
host_list = host_list[2][1]
lan_address
= "0.0.0.0"
ip = 8887
port
class Handler(SimpleHTTPRequestHandler):
def do_GET(self):
self.headers)
logger.info(self)
SimpleHTTPRequestHandler.do_GET(
= HTTPServer(('', port), Handler)
httpd print('HTTPServer began -> http://{}:{}'.format(lan_address, port))
httpd.serve_forever()
関連記事
- ESP32でHTTPClientを使ってウェブサーバーにGET、POSTするやり方
- Androidアプリ開発でhttpへアクセスできないネットワークエラー対処
- Android で WebSocketサーバー 【Kotlin/アプリ開発】
- ESP32でHTTPSアクセス、ただし証明書検証なし
- LaravelでTailwind CSSが反映されない