タイトルを読んだ人は「そんなのPythonの標準ライブラリを使えばできるよ」かもしれません。それは仰る通りですが、同期処理かつシングルスレッド実装という欠点があるため大量の画像やリソースを読み込むようなユースケースによっては「もたつきすぎる」と感じることがあります。
もう少しちゃんとしたWebサーバを導入できれば良いのですが、特殊な開発環境、デモ向け環境では手軽にApacheやNginxやpipライブラリを導入することができなかったりします。
bottle.py
とwaitress
により、ApacheやNginxやpipライブラリを別途インストールすることなく動作可能なそこそこレスポンスの良いWebサーバを実現できます。
概要
以下のbottle.py
とwaitress
を同梱する形でWebサーバを配布します。
-
bottle.py
はPythonのシンプルなWebフレームワークです。Pythonファイル1個で構成されています。今回利用するWebサーバ実装であるwaitress
にも対応します。 -
waitress
はPythonで実装されたマルチスレッドかつ非同期処理実装のWebサーバです。性能面ではC言語などで実装されたWebサーバには遠く及びませんが、Pythonの標準Webサーバと比較すればかなりレスポンス面で優れています。
上記のWebサーバには以下のメリットがあります。
- Python2.7/3.5が入っている環境であれば動作する。(対象バージョンはもっと広いかも)
- マルチプラットフォームで動作する。(Windows, Linux等)
- マルチスレッドかつ非同期処理の実装であるため、Pythonの標準ライブラリHTTPサーバよりも高速。
対象者
以下の項目に当てはまる人が対象です。
- Pythonに同梱されている標準Webサーバは遅すぎるため使いたくない。
- しかし色々な環境(異なるマシン、異なるOS)で動かすため、Apache、Nginx、pipのサードパーティライブラリ等はインストールしたくない。
補足:
ちなみに「Pythonすら入れたくない」という場合は、Node.jsが組み込まれているElectronという選択肢もあります。Pythonだと配布する際に色々と頭を悩ましますが、JavaScript/Node.jsはこのあたりが大分楽なので羨ましいです。
手順
以下のディレクトリ構成をもつ資材を作成する手順を示します。
mywebapp/
server.py (自分で作るPythonスクリプト)
libs/
bottle.py
waitress/
... (色々入るため省略)
以下のシェルコマンドを実行することにより、必要なPythonライブラリのダウンロードおよび解凍が行われます。
mkdir mywebapp
cd mywebapp
touch server.py
mkdir libs
cd libs
curl -OsL https://raw.githubusercontent.com/bottlepy/bottle/0.12.13/bottle.py
curl -sL https://github.com/Pylons/waitress/archive/v1.1.0.tar.gz | tar xz --strip=1 waitress-1.1.0/waitress
cd ..
server.py
には以下のソースコードを記述します。
- sys, osモジュールを使用してlibs配下のPythonモジュールを参照できるようにPATH設定しています。
- bottle.pyのrun関数のserver引数には
server="waitress"
と指定してください。他の引数は自由です。
import sys
import os
# bottle.py, waitressのPATH設定
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'libs'))
from bottle import route, run, template
@route('/hello/<name>')
def greet(name):
return template('<b>Hello {{name}}</b>!', name=name)
# bottle.py起動時にWebサーバとしてwaitressを指定
run(server="waitress", host='localhost', port=8080)
これで準備完了です。以下のコマンドでserver.pyを起動すると、bottle.py + waitress でWebサーバが稼働状態となります。あとはブラウザで http://localhost:8080/hello/world
にアクセスすれば、Hello Worldページが表示されます。
python server.py
bottle.pyについてはQiitaに色々な記事があるので、そちらを参照してください。