Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@yoichiwo7

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

More than 3 years have 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に色々な記事があるので、そちらを参照してください。

7
Help us understand the problem. What is going on with this article?
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
yoichiwo7
秋葉原の某所でエンジニアとして働いてます。 開発ワークフロー改善、およびKubernetes等のインフラ関連の技術にハマってます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?