PythonでWebアプリを作る
ラズパイには、Pythonがあらかじめインストールされています。そのPythonに組み込まれているWebサーバー機能を利用して、Pythonだけで、動的Webアプリを作ります。
動的Webアプリの概要
ラズパイには標準で、CGIHTTPServerという、ユーザからの入力により、ダイナミックに出力処理を変更するCGIに対応したWebサーバーが組み込まれています。この機能を利用して、iMacやiPhoneなどのクライアントのブラウザーに表示されたホームページのHTML画面のボタンを操作すると、ラズパイに接続されたLEDの点灯を制御できるアプリを作成します。
クライアント機はWiFiでラズパイWebサーバーの index.html を読み込み表示します。ブラウザーでの操作情報はWebサーバーを経由し、Pythonで処理されます。Pythonの処理プログラム(querytest.py)では、LEDを点灯し、処理結果はHTMLデータにして、クライアントに返信されます。
NOTE: LEDは、GPIO 11,GPIO 9,GPIO 10 pinに、12v用抵抗入りLEDを接続しました。
使用するファイルの保存
まず、外部からの入り口となるディレクトリー PythonWeb をユーザールートディレクトリーに作成し、PythonWeb 内に、短いファイル3つを保存します。このファイルは、Webサーバーを起動させる Pythonプログラム cgiserber.py と ホームページのトップページとなる index.html と style.css です。
さらに、動的アプリを実現するPythonプロブラムを保存するための ディレクトリ cgi-bin を作成し、その中に querytest.py を保存します。
これらをラズパイ上で直接 NANO で作成しても、また、MACなどで作成し、SFTP で、ラズパイに転送しても構いません。自分の環境にあった方法で作成してください。
なお、ファイルは UTF-8 でテキストエンコーディングします。
ドキュメントルートに保存した index.html でボタンを3つ表示し、その一つをクリックすると、その情報を「GET」手法で cgi-bin ディレクトリーにある querytest.py に渡します。 |
cgiserver.py
import CGIHTTPServer CGIHTTPServer.test()
index.html,
<!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="style.css" type="text/css" /> <title>CGIHTML</title> </head> <body> <p>LED On/Off !</p> <form method="GET" action="cgi-bin/querytest.py"> <input type="submit" name="btn" value="1"> <input type="submit" name="btn" value="2"> <input type="submit" name="btn" value="3"> </form> </body> </html>
NOTE: <meta name="viewport" ... は、iPhoneで表示させた時に縮小表示させないための指示。
style.css
@charset "UTF-8"; input{ -webkit-appearance: none; font: 130% Arial; background-color: lightgrey; border: 1px solid gray; width: 70px; height: 70px; border-radius: 10px; }
NOTE: CSSで、ページに表示されるINPUTボタンの大きさと色を変更します。
-webkit-appearance: none; は、iPhoneでCSSの指示を反映させるコマンド。
querytest.py
#!/usr/bin/env python # coding: utf-8 html_body=""" <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="../style.css" type="text/css" /> <title>CGIHTML</title> </head> <body> <p>ボタン %s をクリックしました。!</p> <form method="GET" action="cgi-bin/querytest.py"> <input type="submit" name="btn" value="1"> <input type="submit" name="btn" value="2"> <input type="submit" name="btn" value="3"> <input type="submit" name="btn" value="Off"> </form> </body> </html> """ # CGI関連命令読込 import cgi # GET情報を thebtn に読込 form=cgi.FieldStorage() thebtn=form.getvalue('btn','N/A') # GET入力情報を反映したページを返信 print "Content-type: text/html\n" print html_body % thebtn # GPIO関連命令読込 import RPi.GPIO as GPIO # LED設置ピンの定義 LED9 = 9 LED10 = 10 LED11 = 11 LEDs = (9,10,11) # GPIO LEDピンを出力に設定 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(LEDs, GPIO.OUT) # GET入力情報によりLED点滅 if thebtn == "1": GPIO.output(LED11,not(GPIO.input(LED11))) elif thebtn == "2": GPIO.output(LED9,not(GPIO.input(LED9))) elif thebtn == "3": GPIO.output(LED10,not(GPIO.input(LED10))) else: GPIO.output(LEDs,0) # GPIO リセット GPIO.cleanup()
NOTE: このファイルには実行権限を付与させること。
CGIHTTPServerの起動
Webサーバーを起動するには、ディレクトリー PythonWeb に移動して、cgi-bin ディレクトリ内の querytest.py に実行権限があることを確認し、Python で、cgiserver.py を実行します。ちょっと遅れて、「Serving HTTP on 0.0.0.0 port 8000 ...」と表示されれば、稼働しています。
pi@raspberrypi:~ $ cd PythonWeb pi@raspberrypi:~ $ ls cgi-bin cgiserver.py index.html style.css pi@raspberrypi:~ $ chmod 755 cgi-bin/querytest.py pi@raspberrypi:~ $ ls -l cgi-bin total 4 -rwxr-xr-x 1 pi pi 1195 Jan 8 11:30 querytest.py pi@raspberrypi:~ $ python cgiserver.py Serving HTTP on 0.0.0.0 port 8000 ...
動的アプリの動作確認
Macなどのブラウザーを立ち上げ、アドレス欄に
raspberrypi.local:8000
と入力します。
表示されたページのボタンをクリックします。
どのボタンをクリックしたかが正しくブラウザーに表示され、ラズパイのLEDが点灯・消灯すればOKです。
CGIHTTPServerの停止
Webサーバーサービスを停止するには。ターミナル画面で「CTL + c」をキーボードから入力します。また、単にターミナルソフトを終了させてもWebサーバーサービスを停止させることができます。