262.ラズパイ無双[9_bottle(WebAPサーバー)]
初回:2022/6/22
Raspberry Pi (ラズベリーパイ、通称"ラズパイ")で何か作ってみようという新シリーズです。最終的にはカメラ画像をストリーミング出来るサーバーを構築したいと思いますが、まずはそのためのWebアプリケーションサーバーを構築したいと思います。
あくまでラズパイ上で動かすWebAPサーバーなので、出来るだけ単純で軽量なサーバーが良いと思います。そこで、まず最初に取り上げたいのが『bottle』です。
P子「bottleとかFlaskとか、面白いネーミングよね」※1
1.bottleの特徴
bottleは、Flaskと同様に『マイクロフレームワーク』と呼ばれる高速、シンプル、軽量な設計のWebアプリケーションフレームワークです。最も特徴的だと思えるのは、一つのPythonプログラムだけで構成されており、Python標準ライブラリ以外の依存関係はありません。
≪参考資料≫
https://runebook.dev/ja/docs/bottle/
ボトル:Pythonウェブフレームワーク
あえて問題があるとすれば、stable版が0.12.21(Uploaded May 27, 2022)ですが、次期版と目されるdevelopment版の0.13-devで、APIが色々と変更されています。ですが、0.13がリリースされる予定がなかなか見えてきません。なかなか困ったもんです。
業務で使用するなら安定版を選択しますが、『『私は』Pythonで業務システムは組めません』ので、以下の説明では、development版の0.13-devを使用したいと思います。
2.bottleのインストール
bottleの最大の特徴と言えば、1ファイルのみを自分のプロジェクトファイルに置くだけで使用できるという所でしょうか。つまり、pipでインストールするのではなく、ダウンロードして使用できるのがうま味です。
1.フォルダを用意
$ cd
$ mkdir www
2.bottle.py を「同一階層」に設置する
$ cd www
$ wget https://bottlepy.org/bottle.py
このURLで取得できるのは'0.13-dev' です。
0.12 (stable) が欲しい場合は、PyPI から取得します。
※ https://pypi.org/project/bottle/#files の Built Distribution から
最新の bottle-0.12.21-py3-none-any.whl を取得します。
この圧縮ファイルから、bottle.py だけを取り出します。
$ unzip bottle-0.12.21-py3-none-any.whl bottle.py
アーカイブは不要なので削除します。
$ rm bottle-0.12.21-py3-none-any.whl
Source Distribution から取り出す場合は、tar.gz ファイルになります。
※ 必要なファイルのみ取り出す(ただしディレクトリ構成は保存される)
$ tar zxvf bottle-0.12.21.tar.gz bottle-0.12.21/bottle.py
展開後、フォルダ内の『bottle.py』のみ、wwwの直下にコピーします。
$ cp bottle-0.12.21/bottle.py .
残りは不要なので削除します。
$ rm -rf bottle-0.12.21
$ rm bottle-0.12.21.tar.gz
3.動作確認
https://bottlepy.org/docs/dev/ のサンプルプログラムを動かしてみましょう。
from bottle import route, run, template
@route('/hello/
def index(name):
return template('Hello {{name}}!', name=name)
run(host='0.0.0.0', port=8088)
host='0.0.0.0' にすることで、どこからでもアクセスできるようになります。また、アクセスするポートを8088に変更していますので、254.ラズパイ無双[3.セキュリティ]の『4.使わないポートを閉じる』で、8088ポートを開放しておいてください。
サーバーを起動します。
$ python3 ./hello.py
他のPCなどからアクセスします。
http://≪ラズパイIPアドレス≫:8088/hello/world
4.マルチスレッド化(waitress)
Bottle はシングルスレッドなので、マルチスレッド化してみます。
Waitress というWSGI serverを適用します。
https://docs.pylonsproject.org/projects/waitress/en/stable/
https://pypi.org/project/waitress/#files の Built Distribution から、
waitress-2.1.2-py3-none-any.whl を取得します。
$ cd
$ cd www
$ unzip waitress-2.1.2-py3-none-any.whl waitress/*
展開後、不要なファイルは削除します。
$ rm waitress-2.1.1-py3-none-any.whl
Bottle インスタンスで構築する方法で作ってみます。
import bottle
from waitress import serve
app= bottle.Bottle()
@app.route('/hello/
def index(name):
return bottle.template('Hello {{name}}!', name=name)
# run(host='localhost', port=8080)
# run(host='0.0.0.0', port='8088', debug=True)
# run(server="waitress", host='0.0.0.0', port='8088')
serve( app , host='0.0.0.0', port=8088,threads=10 ) # threadsはデフォルト 4
5.特別編(プロセスの終了)
現状のプログラムでは、サーバーを停止してもポートを開放しない時があります。その場合、もう一度サーバーを立ち上げようとしてもエラーで立ち上がりません。
プロセスを kill する必要があります。
手順としては、ポート指定で、PID を見つけて、kill します。
$ lsof -i:8088
$ python3 850 xxx 11u IPv4 21123 0t0 TCP *:omniorb (LISTEN)
$ kill -9 850
とりあえず、bottle を使用できるようにしました。まだまだ物足りないと思いますが、ストリーミングサーバー構築までお付き合いください。
ほな、さいなら
======= <<注釈>>=======
※1 P子「bottleとかFlaskとか、面白いネーミングよね」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。