Help us understand the problem. What is going on with this article?

bottle.py + waitressでPythonのみで動作可能なWebサーバ

More than 1 year has passed since last update.

タイトルを読んだ人は「そんなのPythonの標準ライブラリを使えばできるよ」かもしれません。それは仰る通りですが、同期処理かつシングルスレッド実装という欠点があるため大量の画像やリソースを読み込むようなユースケースによっては「もたつきすぎる」と感じることがあります。

もう少しちゃんとしたWebサーバを導入できれば良いのですが、特殊な開発環境、デモ向け環境では手軽にApacheやNginxやpipライブラリを導入することができなかったりします。

bottle.pywaitressにより、ApacheやNginxやpipライブラリを別途インストールすることなく動作可能なそこそこレスポンスの良いWebサーバを実現できます。

概要

以下のbottle.pywaitressを同梱する形で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に色々な記事があるので、そちらを参照してください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした