しゃちの備忘録

これからC++を始める人によるC++の備忘録です(今のところ)

Pythonでwebアプリを作ってみる その2(SimpleHTTPServerを使う)

前回(Pythonでwebアプリを作ってみる その1 - しゃちの備忘録)の続きです.

SimpleHTTPServerを用いてシンプルなWebサーバを作って見ました. 個人的に忙しかったり,記事が消えたりしましたが私は元気です.

今回の目標

SimpleHTTPSerbverで,サーバーを立ち上げて何かを表示できるようになる.

Webサーバとは

Wikipediaによると以下の通り.

Webサーバ(ウェブサーバ)は、HTTPに則り、クライアントソフトウェアのウェブブラウザに対して、HTMLやオブジェクト(画像など)の表示を提供するサービスプログラム及び、そのサービスが動作するサーバコンピュータを指す。 広義には、クライアントソフトウェアとHTTPによる通信を行うプログラム及びコンピュータ。

クライアントからのリクエストに基づいて,なんらかのデータを返すのがサーバの仕事のようです. PythonではDjangoなどが有名だと思います.

SimpleHTTPServerでWebサーバを立てる

とりあえず,HTTPリクエストを返すシンプルなWebサーバを作成するということで,SimpleHTTPServerを使って見たいと思います. Pythonに標準モジュールとして入っているので,準備の手間が省けるのもポイントです.

なお今回は,Python3系を使用しています. 少しだけPython2系の場合にも触れますが,基本的にはPython3系で話を進めて行きます.

Pythonを起動し,コンソールに以下のコードを入力して見ましょう.

>>> import http.server
>>> http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler)

すると以下のような画面になります. f:id:teru0rc4:20170530145838p:plain

この状態でhttp://localhost:8000にアクセスして,ディレクトリリスト(じゃない場合もあり得る?)が見えていたらひとまずOKです..

ここまでの段階で,上で入力したコードにより,localhost(自分のPC)8000番ポートにサーバが建てられ, 上記アドレスにアクセスすることで,そこの状態が確認できる,と言った状態になりました. 特に指定しなければ,ポートは自動的に8000,が割り当てられます. もしサーバのポートを指定したい場合は,http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler, port=8001)と言った風に最後にport = *****といった記述を追加してあげて下さい. 特にサーバに関しての設定等を行なっていないので,ひとまずは自分のディレクトリの中身がみれるという状態になります.

本当に最低限ではありますが,これでサーバ立てはできました. 建てたサーバの停止方法は,Ctrl + Cになります.これをしないとこれ以降サーバを建てる時に前回以前の建てたサーバが残ってしまい,指定したポートにサーバを立てられないことが起こるので気を付けましょう.(その場合,サーバの当該プロセスを探してkillすればいいので,そこまで焦る必要もないです.方法は後述)

ワンライナーでサーバを起動する方法

もう一つ,SimpleHTTPServerでサーバをささっと立てる方法を記述しておきます. 先ほどはPythonのプロンプト場での入力でしたが,今回はPythonプロンプトを立ち上げる前の段階でのコマンドになります.

$ python3 -m http.server

このようにすると上と同じようにサーバを構築できます,ポート番号を指定したい場合はpython3 -m http.server 8001のようにするとできます.

サーバがうまくたたち上がらない場合

上で述べたコマンドを実行した場合に,下のようにAddress is already in useと出ることがあります. f:id:teru0rc4:20170530151328p:plain

このようなメッセージが出る場合,サーバを立てようと指定したポートにすでにサーバが立ち上がっている(前回以前にちゃんとkillできていなかった)ことが起きています. なので,残ってしまっているプロセスをキルしてあげる必要があるのです.

立ち上がっているサーバのプロセスをキルしたい場合

psコマンドを使うことで,現在立ち上がっているプロセスの確認ができます. f:id:teru0rc4:20170612153313p:plain

その中にhttp.server ****(****はポート番号)というプロセスがあるはずです. 今回はこのプロセスをキルします. 該当プロセスのPID(プロセスID)を確認し,kill -15 *****と入力します. -15とすることで,プロセスの強制終了ができます.

今回の例では以下のような感じになってます. キルが実行され,該当プロセスが消えているのがわかると思います. f:id:teru0rc4:20170612153622p:plain

おわりに

この後どうしようかなーと思っていたのですが,そのうちにひと月経ってしまったので, ひとまずここまで公開します.

次は立てたサーバで何か動かすところからやりたいと思います.

追記

SimpleHTTPServerで作業する内容もう少し続くのかなと思ったら動的なものを作ろうと思ったら使わなそうなので, そのあと調べたことを追記してSimpleHTTPServer関連の話はここで打ち切りたいと思います.

サーバアクセス時の処理について

今回使用したSimpleHTTPSerbverを上のような手順で使用した際,サーバ立ち上げたときディレクトリのリストが出力されたと思います.(厳密には現在の作業ディレクトリのリスト)

これはSimpleHTTPSerbverに, サーバを立てた時のディレクトリに「index.html」,「index.htm」がある場合,それらを開く. ない場合はディレクトリリストを開くという実装になっているからです.(ので前回は~/のディレクトリリストが取得されたのです)

詳しい話はdo_GETの中(send_head)に定義されていました. github.com

index.html以外を開く場合はそれようのオプションもあるので,困ることはないと思います. ので,実際にディレクトリリスト以外を表示するところまでやって見たいと思います.

index.htmlを記述し動かす

今回は以下のようなファイルを作成しました. ファイル名はindex.htmlとしてください.

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>SampleHTML</title>
  </head>
  <body>
    <p>Python is awesome!</p>
  </body>
</html>

またサーバーを起動するスクリプトも,ファイルに保存してしまいたいと思います. ***.py(***は何でも良い,今回は暫定的にserver.pyとして話を進めます)という名前で保存します.

import http.server
http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler)

これら2つのファイルを同じディレクトにいれ保存してあげてください. f:id:teru0rc4:20170711154241p:plain

そして,server.pyを実行します.

$ python3 server.py
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

f:id:teru0rc4:20170711154602p:plain

するとこんな風に先ほどindex.htmlに記述されたwebページが出力されました. このようにindex.htmlを表示するだけですがこれでwebサーバが建てられました.

しかし,これでは静的な変化のないサイトの記述しかできません. 次回は動的なサイトを記述できるよう,別のモジュールを使いたいと思います.