【Python】簡単なHTTPサーバー(http.server)をすぐに作成する

ここに画像の説明を挿入

序章

http.serversocketserver.TCPServerHTTP ソケットを作成してリッスンし、リクエストをハンドラーにディスパッチする のサブクラスです。この記事は、 Python モジュールを使用してhttp.serverシンプルな HTTP サーバーをすばやく構築する方法に関するチュートリアルです。

インストール

Python3 の標準モジュールが組み込まれており、インストールする必要はありません。(Python2 の以前のバージョンでは、名前は でしたSimpleHTTPServer)

チュートリアル

コマンドラインから作成

http.server は、Python インタープリターの -m パラメーターを使用した直接呼び出しをサポートしています。

次のコマンドを実行して、最も単純な HTTP サーバーを作成します。

python -m http.server

サーバーのデフォルトのリスニング ポートは 8000 で、カスタム ポート番号をサポートします。

python -m http.server 9000

-b/--bindサーバーはデフォルトですべてのインターフェースにバインドされており、 localhost などのアドレスを指定することで指定できます。

python -m http.server --bind 127.0.0.1

サーバーのデフォルトの作業ディレクトリは現在のディレクトリであり、-d/--directory作業ディレクトリはパラメータを通じて指定できます。

python -m http.server --directory /tmp/

さらに、パラメータを渡すことでCGI--cgiリクエスト ハンドラを有効にすることができます

python -m http.server --cgi

作成するコードを書く

http.server はコード内での呼び出しもサポートしており、対応するクラスと関数をインポートするだけです。

from http.server import SimpleHTTPRequestHandler
from http.server import CGIHTTPRequestHandler
from http.server import ThreadingHTTPServer
from functools import partial
import contextlib
import sys
import os


class DualStackServer(ThreadingHTTPServer):
    def server_bind(self):
        # suppress exception when protocol is IPv4
        with contextlib.suppress(Exception):
            self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
        return super().server_bind()


def run(server_class=DualStackServer,
        handler_class=SimpleHTTPRequestHandler,
        port=8000,
        bind='127.0.0.1',
        cgi=False,
        directory=os.getcwd()):
    """Run an HTTP server on port 8000 (or the port argument).

    Args:
        server_class (_type_, optional): Class of server. Defaults to DualStackServer.
        handler_class (_type_, optional): Class of handler. Defaults to SimpleHTTPRequestHandler.
        port (int, optional): Specify alternate port. Defaults to 8000.
        bind (str, optional): Specify alternate bind address. Defaults to '127.0.0.1'.
        cgi (bool, optional): Run as CGI Server. Defaults to False.
        directory (_type_, optional): Specify alternative directory. Defaults to os.getcwd().
    """

    if cgi:
        handler_class = partial(CGIHTTPRequestHandler, directory=directory)
    else:
        handler_class = partial(SimpleHTTPRequestHandler, directory=directory)

    with server_class((bind, port), handler_class) as httpd:
        print(
            f"Serving HTTP on {
      
      bind} port {
      
      port} "
            f"(http://{
      
      bind}:{
      
      port}/) ..."
        )
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\nKeyboard interrupt received, exiting.")
            sys.exit(0)


if __name__ == '__main__':
    run(port=8000, bind='127.0.0.1')
  • server_class: サーバークラス
  • handler_class: リクエスト処理クラス
  • port:ポート
  • bind:IP
  • cgi: CGIリクエストハンドラを有効にするかどうか
  • directory:作品一覧

http.server で HTTP サーバーをすばやく作成できることがわかりましたが、これはどのようなプロジェクト シナリオに適用できるでしょうか?

  1. LAN 内の小規模な Web プロジェクトのプレビュー
  • プロジェクトディレクトリ
web:.
├─index.html
  • インデックス.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    hello world
</body>
</html>
  • ディレクトリに切り替えてcd webコマンドを実行しpython -m http.server、ブラウザのアドレス バーに入力してlocalhost:8000次を表示します。
hello world

LAN 内の他のユーザーは、ホスト IP + ポート番号を通じてアクセスできます。ホスト IP が 192.168.0.1 の場合、URL 192.168.0.1:8000 を同僚やクラスメートに送信すると、インデックスを参照することもできます。 html レンダリングするファイルのコンテンツ。

  1. ローカルブラウザでリモートサーバーにアクセスするためのポートマッピング

VSCode 経由でリモート サーバーに接続する場合、http.server を使用してポートを開いた後、ポートが自動的にローカルにマッピングされるため、ローカル ブラウザでリモート サーバーのリソースを表示およびダウンロードできます。(VSCode に加えて、他のツールでもリモートおよびローカルのポート マッピングを実装できる必要があります)

知らせ

http.server は最も基本的なセキュリティ レビューのみを実装しているため、運用環境では使用しないでください。

参考

http.server 公式ドキュメント

カバー

【アーティスト】フカヒレ 【PステーションID】78142008

おすすめ

転載: blog.csdn.net/qq_42951560/article/details/124218348