📘

PythonのHTTPServer

2022/12/19に公開

この記事はPhon 3.7の環境で実行しています。

「HTTPServer」でHTTPサーバーをたてる(本番環境利用は非推奨)

import文
from http.server import HTTPServer

main.py
from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler

server_address = ('localhost', 8080)
httpd = HTTPServer(server_address, BaseHTTPRequestHandler)
httpd.serve_forever()

HTTPServerのコンストラクタの第一引数には、タプル(サーバー名、ポート番号)を入れます。

コマンドを実行
python main.py

ブラウザで確認してみましょう。

実装はしていないので501のエラーコードが出ていますが、起動できていることが確認できます。

コンソール
127.0.0.1 - - [19/Dec/2022 21:02:37] code 501, message Unsupported method ('GET')
127.0.0.1 - - [19/Dec/2022 21:02:37] "GET / HTTP/1.1" 501 -
127.0.0.1 - - [19/Dec/2022 21:02:37] code 501, message Unsupported method ('GET')
127.0.0.1 - - [19/Dec/2022 21:02:37] "GET /favicon.ico HTTP/1.1" 501 -

コンソールには、アクセスの情報が表示されます。
中止する場合はCtrl + C を押します。

GETメソッドに対応する。

BaseHTTPRequestHandlerを継承した自作のクラスを作成してみましょう。(CustomHTTPRequestHandler)

main.py
from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler


class CustomHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain; charset=utf-8')
        self.end_headers()
        self.wfile.write('GETメソッドを実装'.encode())


server_address = ('localhost', 8080)
httpd = HTTPServer(server_address, CustomHTTPRequestHandler)
httpd.serve_forever()

※「do_GET」の名称を変えると動かなくなります。

今度はステータスコードが200になり、正常となりました。

POSTメソッドに対応する

main.py
from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler


class CustomHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', "text/html")
        self.end_headers()
        html_context = '<html lang="ja">' \
                       '<meta charset="UTF-8"><form method="POST" action="/"><input type="submit" value="送信"></form>' \
                       '</html>'
        self.wfile.write(html_context.encode())

    def do_POST(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain; charset=utf-8')
        self.end_headers()
        html_context = "送信完了"
        self.wfile.write(html_context.encode())


server_address = ('localhost', 8080)
httpd = HTTPServer(server_address, CustomHTTPRequestHandler)
httpd.serve_forever()

ブラウザでPOSTメソッドを確認するのは地味にめんどくさいので、「ボタン」を用意しました。

送信ボタンを押すと...

ログを確認すると

127.0.0.1 - - [19/Dec/2022 22:43:03] "POST / HTTP/1.1" 200 -

POSTメソッドでアクセスしていることが確認できます。

POSTメソッド~bodyパラメータを監視する。

main.py
from http.server import HTTPServer
from http.server import BaseHTTPRequestHandler


class CustomHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', "text/html")
        self.end_headers()
        html_context = '<html lang="ja">' \
                       '<meta charset="UTF-8"><form method="POST" action="/">' \
                       '<input type="hidden" name="word" value="abcde">' \
                       '<input type="submit" value="送信">' \
                       '</form>' \
                       '</html>'
        self.wfile.write(html_context.encode())

    def do_POST(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain; charset=utf-8')
        self.end_headers()
        print(self.rfile.read(int(self.headers['content-length'])).decode('utf-8'))
        html_context = "送信完了"
        self.wfile.write(html_context.encode())


server_address = ('localhost', 8080)
httpd = HTTPServer(server_address, CustomHTTPRequestHandler)
httpd.serve_forever()

bodyパラメータをチェックしてみましょう。

パラメータの確認
127.0.0.1 - - [19/Dec/2022 23:40:26] "GET /favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [19/Dec/2022 23:40:31] "POST / HTTP/1.1" 200 -
word=abcde

Discussion