今回はPython3を使ってまず簡単なHelloサーバーを作りたいと思います。まず使ってるPythonモジュールはhttp.serverの中にあるHttpServerとBaseHTTPRequestHandlerです。
詳しい説明はこちらへ→https://docs.python.jp/3/library/http.server.html
まず、http.serverとHttpServerとは?
このモジュールは HTTP (web) サーバを実装するためのクラスを提供しています。クラス
HTTPServer
はsocketserver.TCPServer
のサブクラスです。HTTPServer
は HTTP ソケットを生成してリクエスト待ち (listen) を行い、リクエストをハンドラに渡します。
なるほど、このモジュールにあるHttpServerクラスを使えばHTTPリクエストの待ちと処理できますね。じゃBaseHTTPRequestHandlerとは?
このクラスはサーバに到着したリクエストを処理します。 このメソッド自体では、実際のリクエストに応答することはできません; (GET や POST のような) 各リクエストメソッドを処理するためにはサブクラス化しなければなりません。
BaseHTTPRequestHandler
では、サブクラスで使うためのクラスやインスタンス変数、メソッド群を数多く提供しています。このハンドラはリクエストを解釈し、次いでリクエスト形式ごとに固有のメソッドを呼び出します。メソッド名はリクエストの名称から構成されます。例えば、リクエストメソッド
SPAM
に対しては、do_SPAM()
メソッドが引数なしで呼び出されます。リクエストに関連する情報は全て、ハンドラのインスタンス変数に記憶されています。サブクラスでは__init__()
メソッドを上書きしたり拡張したりする必要はありません。
いわゆるリクエストの処理ですね。じゃ、説明はここまでにしましょう。
実際のコードはこんな感じです:
from http.server import HTTPServer, BaseHTTPRequestHandler class HelloHandler(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("Hello, HTTP!\n".encode()) if __name__ == '__main__': server_address = ('', 8004) httpd = HTTPServer(server_address, HelloHandler) httpd.serve_forever()
実際はどんなことをやってますか?
from http.server import HTTPServer, BaseHTTPRequestHandler
http.serverのモジュールにHttpServerとBaseHTTPRequestHandlerをImportします。
class HelloHandler(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("Hello, HTTP!\n".encode())
リクエストを処理するコードを書き、ここはdo_GETをOverwriteします。
self.send_response(200)
send_responseを使って200をResponse Headerに入れます。
self.send_header('Content-type', 'text/plain; charset=utf-8')
send_headerを使ってHttp headerを入れます。
self.end_headers()
headerにblank lineを入れてHeaderはここまでですと教えます。先はsend_response()とsend_headerを使ったので必ずend_headers()も入れてください。
self.wfile.write("Hello, HTTP!\n".encode())
responeseを書き、.encode()をStringからByte Objectに変換します。
if __name__ == '__main__': server_address = ('', 8004) httpd = HTTPServer(server_address, HelloHandler) httpd.serve_forever()
Mainですね。
server_addressは(”,8004)。つまり全てのIP AddressのPort8004を待ちます。次は新しいHTTPServerクラスを作って、先のserver_addressとhandler_class入れて、最後はhttpd.serve_foreve()でshutdown()くるまでずっとリクエストを処理できるようにします。
次はTerminalを起動し、python3 application.pyを起動します。
http://localhost:8004
ここをアクセスすれば、
127.0.0.1 - - [08/Dec/2017 05:12:03] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [08/Dec/2017 05:12:03] "GET /favicon.ico HTTP/1.1" 200 -
Terminalからみるといまはアクセスした時間、GET?POSTどっちの処理したかもう見えます。favicon.icoはちょっと調べたけど…
A favicon.ico file is that little icon that can appear in your browser URL navigation box.
うん、つまりBrowserのTabの上の小さいなICONのことですね。
おめでとう!これで完成です。