📘
PythonのHTTPServer
この記事は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