Raspberry Pi に標準で入っている Flask を使って、Web サーバーを動かしてみます。
余計なインストールなどはせず、標準で入っているライブラリ(Python と Flask)だけを使って動かしてみます。
以下の環境で動作確認をしています。
環境の一例:
・ Raspberry Pi 3 model B+ (bullseye 、サーバーとして使用)
・ Windows パソコン(クライアントとして使用)
・ Wi-Fi ネットワーク(ローカルネットワーク)
背景 ~ Raspberry Pi で Flask を動かしてみる
Raspberry Pi の起動用 SDカードを作成すると、Python に加え、標準で Flask (フラスク)も入っています。
Flask と一緒によく使われるテンプレートエンジン Jinja2 も入っています。
新たなプログラムをインストールすることなく Flask がすでに動くのであれば、Flask の便利な機能を活用したほうが得だ、ということになります。
Web サーバーといえば、LAMP (Linux, Apache, MySQL, PHP) が知られています。しかし、ローカルネットワーク内などでちょっとした Web アプリを試したい/動かしたいとなったとき、設定が煩雑です。また、Raspberry Pi の処理能力の点でも疑問が残ります。
以前、Python の標準機能のみを使って Web サーバーを動かしています。そこで今回は、最小限の手間で Flask 版の Web サーバーを動かしてみることにします。
Web サーバーさえ動けば、トップページの HTML を作りこんでいくだけで、Web サイト、Web アプリを自由に作成できることになります。
デフォルトの機能を使っているだけですので、作った Web アプリについても移植性が担保でき、環境設定の煩雑さも最小化できることになります。
設定方法
① 以下を参考に、Raspberry Pi にフォルダを作成してください。このフォルダをドキュメントルート(公開フォルダ)にします。
例: /home/pi/flask1
② ①のフォルダに “app.py” という名前でテキストファイルを作成してください。
このファイル app.py に、下記のサンプルスクリプトをコピー&ペーストで貼りつけて保存してください。
サンプルスクリプトは、下記の外部リンクに示したクイックスタートとほぼ同じです。
使い方
Web サーバーを動かす
③ 以下のコマンドを実行し、Raspberry Pi の IP アドレス(ローカルIPアドレス)を確認してください。
hostname -I
例: 192.168.1.33
※ 詳細は、ターミナルで “ip addr”、”ifconfig” などを実行すると確認できます。
Wi-Fi 接続であれば、wan0、LAN ケーブル接続であれば、eth0 の項目で、ローカルネットワーク内の IP アドレスを確認できます。ネットワークに正常に接続されていれば、192.*.*.*、172.*.*.*、10.*.*.* となるはずです。
※ あるいは、以下でも確認できます。
・ Raspberry Pi 画面右上の Wi-Fi マーク(ネットワーク)上にマウスを移動させる。
→ wlan0: Configured 192.168.1.33/24 等と表示される。
・ Windows でリモートデスクトップで Raspberry Pi にアクセスしている場合は、画面左上に表示される。
④ Raspberry Pi のターミナルで、①のフォルダ(ドキュメントルート)に移動してください。
例:
cd /home/pi/flask1
⑤ 以下のコマンドを実行してください。
flask run --host=0.0.0.0 --port=5000
→ “Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)” といった文字列が表示されたら、Web サーバーの起動成功です。
※ Web サーバーを終了する場合は、ターミナル上で [ctrl] + “c” キーを入力してください。
※ Web サーバー起動時のフォルダ(④で設定)が、ドキュメントルート(公開フォルダ)となります。
※ ”- -host = …” を追加しているのは、ローカルネットワーク内で、他のパソコンからアクセスできるようにするためです。
※ ”- -port=5000″ の部分で、ポート番号を指定(明示)しています。ポート番号を変える場合はこの部分を 8000 などの数値に変更してください。”- -port=5000″ の部分を省略するとデフォルトの 5000 になります。
※ ”flask run –help” とするとヘルプが参照できます。たとえば、”–port INTEGER” とするとポート番号が指定できる旨の記載があります。
ブラウザから Web サーバーにアクセスする
⑥ ⑤の Web サーバーが動いている状態で、Raspberry Pi と同じネットワーク内の別のパソコン(Windows など)でブラウザを起動し、以下のアドレスにアクセスしてみてください。
例: http://192.168.1.33:5000
→ ”Hello, World!” と表示されたら、Web サーバーへのアクセス成功です!
※ ここで、IP アドレス(192.168.1.33) は、③で確認した値と一致させてください。
また、”5000″ の数値(ポート番号)は、⑤で設定・表示された値と一致させてください。
Flask の起動コマンドのシェルスクリプト化
Web サーバーがうまく動いたら、つぎに、上記のWebサーバーを一度で起動できるようにしましょう。
以下を例に、ラズパイ上でテキストファイル(シェルスクリプト)を作って、内容を書き込み、保存します。
ファイルの場所およびファイル名: /home/pi/start_server_flask1.sh
内容
#!/bin/bash
cd /home/pi/flask1
timeout -sKILL 3600 flask run --host=0.0.0.0 --port=5000
上の記載例では、フォルダの移動後、flask の起動コマンドを実行しています。1時間(3600秒)経つと、サーバーが止まるようにしています。また、ポート番号を明示しています。
作成したら、シェルスクリプトが動作するよう、コマンドラインから実行権限を設定しておきます。
cd /home/pi/
ls -al
chmod 755 start_server_flask1.sh
ls -al
シェルスクリプトを実行する場合は、ターミナルに以下を入力し、[enter] キーを押すと実行できます。
/home/pi/start_server_flask1.sh
※ シェルスクリプトを実行したら、上記の⑥と同様に、ローカルネットワーク内の他のパソコンから、Raspberry Pi にアクセスして、サイトが表示されることを確認してください。
※ Web サーバーを止めるには、[ctrl] + [c] キーを押します。
※ また、Web サーバーがバックグラウンドで動いている場合は、”ps -fA | grep flask” 等とすると、実行中のタスクやコマンドが4桁のタスク番号 XXXX とともに表示されます。
そこで、対応するタスク番号 XXXX について、”kill XXXX” 等とすると、強制的に対応するタスクを終了させることができます。
※ このシェルスクリプトに実行権限を設定し、cron (crontab -e)で登録することで、指定時間に自動で Web サーバーを起動・停止できるようになります。
うまく動いたら
・ うまく動いたら、app.py のスクリプトを書き換えて、アレンジしてみてください。
スクリプトを変更した場合は、⑤の Web サーバーをいったん終了し、⑤以降を、再度実行してください。
・ 例えば、スクリプトで “Hello, World!” の文字列を書き換えてみてください。
str1 = “” の部分が、サーバーが返す HTML に対応しています。この部分を書き換えることで、サイトを発展させてみてください。
・ app.py のファイル名を hello.py 等に変更する場合は、”flask run” を実行する前に、”export FLASK_APP=hello” 等としたコマンドを実行し、その後、”flask run” を実行してください。詳細は、下記の外部リンクを確認してください。
・ app.py のサンプルは、文字列をそのまま返す事例となっていますが、”template” フォルダを作成して “index.html” 等を入れ、app.py のスクリプトで return render_template(“index.html”) 等とすると、テンプレートを表示させることが可能です。
まとめ
Raspberry Pi に標準で入っている Flask を使って、Web サーバーを動かしてみました。
実質的に、スクリプト6行程度で Web サーバーが動きます。
いろいろな方法で Web サーバーを動かしてみると、理解が深まります。
また、ページを作りこんでいけば、ローカルネットワークなどで自由にサイトを作成・活用することが可能です。Flask の便利そうな機能を取り込んでいけばよいということになります。
他にも、Flask や Python を用いた Web アプリを作成し、下記の関連リンクなどで公開しています。
今回のサンプルは最もシンプルなものとしましたが、もし余裕があるようでしたら、下記のファイルアップローダやバーコード作成アプリあたりを動かしてみることをお勧めします。あれこれ動かしてみると感覚がつかめると思います。関心があるようでしたら、参照してみてください。
関連リンク
・ Raspberry Pi でファイルアップローダ 【Flask】
・ バーコード作成 Web アプリ 【Raspberry Pi & Flask】
・ バーコードリーダ Web アプリ 【Raspberry Pi & Flask】
・ Raspberry Pi でローカルWebサーバー 【Python 活用】
・ 初期設定のまとめ 【OpenCV & Raspberry Pi】
・ バッチファイルで Flask を起動する 【Windows & Anaconda】
・ ローカル環境で django をインストールする 【Anaconda & Windows】
・ サーバーのエラーコードのまとめ 【Webサーバー】
外部リンク [PR]
・ Flask Development Server
・ Quickstart Flask Documentation A Minimal Application
・ 「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」
・ Raspberry Pi 5 8GB 技適対応品/アクティブクーラー
・ Raspberry Pi 5用 27W USB-C PD(電源アダプタ)
サンプルスクリプト app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world1():
str1 = "<p>Hello, World!</p>"
return str1