Raspberry Pi に標準で入っている Flask を使って、Web サーバーを動かしてみます。
余計なインストールなどはせず、デフォルトで入っているライブラリだけを使うことにします。
以下の環境で動作確認をしています。
環境の一例:
・ Raspberry Pi (bullseye 他 、サーバーとして使用)
・ Windows パソコン(クライアントとして使用)
・ Wi-Fi ネットワーク(ローカルネットワーク)
背景 ~ Raspberry Pi で Flask を動かしてみる
Raspberry Pi の起動用 SDカードを作成すると、Python に加え、標準で Flask (フラスク)も入っています。
Flask と一緒によく使われるテンプレートエンジン Jinja2 も入っています。
新たなプログラムをインストールすることなく Flask がすでに動くのであれば、Flask の便利な機能を活用したほうが得だ、ということになります。
Web サーバーといえば、LAMP (Linux, Apache, MySQL, PHP) が知られています。しかし、ローカルネットワーク内などでちょっとした Web アプリを動かしてみたいとなったとき、設定が煩雑です。
以前に Python の標準機能のみを使って Web サーバーを動かしています。
そこで今回は、必要最小限の手間で Flask 版の Web サーバーを動かしてみることにします。
Web サーバーさえ動けば、トップページの HTML を作りこんでいくだけで、Web サイト、Web アプリを自由に作成できることになります。
Raspberry Pi のデフォルトの機能を使っているだけですので、作った 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 のサンプルでは、文字列をクライアント側に返す事例としています。
具体的には、スクリプトの @app.route(“/”) としたところで、ブラウザからルート “/” にアクセスしたときに hello_world1() 関数を実行するよう、紐づけをしています。この関数の中で、クライアント側に文字列を返す処理を入れています。
この @app.route() の記載を追加していくことで、ブラウザ側からどこにアクセスしたときに、どういった関数を実行していくのか、処理を自由に追加していくことが可能です。
・ また、②のフォルダ内に “templates” フォルダを作成して “index.html” 等を入れ、app.py のスクリプトで return render_template(“index.html”) 等としていくことで、テンプレートを表示させることなども可能です。
テンプレートを使ったスクリプトを下記の関連リンクにまとめていますので、関心があるようでしたら参照してみてください。
・ Flask のメリットの1つとしては、サーバー側の処理を Python で書くことができる点にあるといえます。たとえば、Raspberry Pi 上で Tensorflow Lite の物体認識の機能がすでに動くのであれば、Flask から Python の物体認識のスクリプトを呼び出すことで、ブラウザから受け取った画像に対し物体認識を行って、クライアント側に結果を返す、といったことが可能です。AI やデータ処理が得意といった Python の動的な機能と Web アプリの機能とを連携させることが可能になります。
まとめ
Raspberry Pi に標準で入っている Flask を使って、Web サーバーを動かしてみました。
実質的に、スクリプト6行程度で Web サーバーが動きます。
いろいろな方法で Web サーバーを動かしてみると、理解が深まります。
また、ページを作りこんでいけば、ローカルネットワークなどで自由にサイトを作成・活用することが可能です。Flask の便利そうな機能を取り込んでいけばよいということになります。
今回は、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