super().do_GET()
前回の、”hello.py”を以下の様に書き換え”hello_01.py”とします。
def do_GET(self):の下を super().do_GET() に置き換えたコードです。
また、"index.html"として下記のファイルを作製。
内容は前回同様画面に大きく”Hello HTTP!"と表示するコードです。 2つのファイルを同じフォルダに保存し、”hello_01.py”を実行。その後PCの ブラウザからサーバにアクセスして下さい。前回同様”Hello HTTP!"と表示されます。
このコードは super().do_GET()のindex.html自動認識機能(サーバのルートにindex.htmlが有れば それを優先的に表示)を使っています。 また、super().do_GET()は ”index.html"内でリンクされたファイルも同様に処理します。 例えば下記の様なCSS("hello.css")ファイルを作り
index.htmlと同じフォルダに保存。index.htmlを"hello.css"を読み込む様に修正
”hello_01.py”を実行しブラウザでアクセスすると
の様にちゃんとCSSファイルも読み込まれている事が分かります。
super().do_GET()を使わない場合
便利なsuper().do_GET()関数ですが、もちろんこの関数を使わなくても”index.html"は送れます。 下記はそのコード。
前回の、”hello.py"の真ん中辺に3行追加しています。
- open(file_name,mode):ファイルをオープンする。
- file_name: パスを伴ったオープンするファイルのファイル名
- mode: ファイルのモード
-
文字 意味 r 読み込み用 (デフォルト) w 書き込み用。同名のファイルが有る場合上書きされる。 x 新規ファイルの書き込み用に開くが既に同名のファイルが有る場合、エラーを返す a 書き込み用。ファイルが存在する場合は末尾に追記。 b バイナリモード t テキストモード
- self.wfile.write():クライアントにデータを送信する関数
- データがバッファを経てクライアントへ送られます。
- バイナリモードで動作するため、必ず bytes型(バイナリ) に変換して渡す必要あり。
- read(): オープンされたファイルからデータを読み出す。
- close(): ファイルのクローズ
これで内部リンクを持たない ”index.html" は問題無く動作するのですが、 ”index.html"が内部リンクを持つ場合はこのコードでは動きません。 追加でリンクファイルに対する処理が必要になります。
次回は
index.htmlがファイルのリンクを持つコードの場合、クライアントから GETリクエストが有った場合の対応について説明します。