結局、FlaskやDjangoなどのフレーム・ワークを使わないと、複雑な<html>は表示できないと思いますが、プログラムが初めての人で、「Pythonとは何?」という段階で、Webに文字を表示させる為の方法をまとめています。 (CGIと連携させているので、後々、さ〇らや、ロリポップなどの、Shared Hostingに設置する場合にも役立ちます。)
前回では、Python 3 のデフォルトでついてくる機能を使って、PC上でWeb Serverの環境を立ち上げてみました。
スクリプトは、こんな感じです。
スクリプトファイル名: simpleserver.py
import http.server
server_address = ("", 8000)
handler_class = http.server.SimpleHTTPRequestHandler #ハンドラを設定
simple_server = http.server.HTTPServer(server_address, handler_class)
simple_server.serve_forever()
server_address = ("", 8000)
handler_class = http.server.SimpleHTTPRequestHandler #ハンドラを設定
simple_server = http.server.HTTPServer(server_address, handler_class)
simple_server.serve_forever()
さて、今回はもう少し発展させてPC上のWebサーバー環境で、動的なスクリプトを動かして、結果をhtmlに表示させたいと思います。
1) 以下のスクリプトを作成し起動。
スクリプトファイル名: cgiserver.py
import http.server
server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #1 ハンドラを設定
server = http.server.HTTPServer(server_address, handler_class)
server.serve_forever()
server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #1 ハンドラを設定
server = http.server.HTTPServer(server_address, handler_class)
server.serve_forever()
*前回の反省も込めてtextエディターで書いたら、しっかりとUTF-8のエンコードで保存。
”前回のスクリプトはファイルや画像を扱う機能しか持っていませんでした。しかし、このスプリプトを使うと、サーバ上でPythonのプログラムを動かすことができます。Pythonのプログラムが出力した結果をレスポンスとして返すことができるのです。
このスクリプトはハンドラにCGIHTTPRequestHandlerを使っています。
ハンドラとは何かの出来事が起きた時にだけ、決まった処理をするもののことです。
前回のスクリプトのSimpleHTTPRequestHandlerは、リクエストを受け取るという出来事が起きると、起動した時のカレントディレクトリにあるファイルを見せました。
CGIHTTPRequesthandlerはリクエストを受け取るという出来事が起きると、サーバ上のPythonのプログラムを動かすというわけです。 レスポンスはWebブラウザが受け取って表示します。つまり、PythonのプログラムとWebブラウザの間で通信ができるわけです。クライアントとサーバの間で通信を行うのは、Webアプリケーションの動作原理の最も基本的な部分です。”
https://coreblog.org/ats/stuff/minpy_web/03/index.htmlより。
2)プログラムの実行
では、実際にPythonのプログラムを設置して、Webブラウザに結果を表示してみましょう。cgiserver.pyというスクリプトを設置したフォルダに、「cgi-bin」という名前のディレクトリを作ります。新たに作ったディレクトリの中に、以下のようなPythonの「test.py」ファイルを設置してください。
スクリプトファイル名: test.py
#!/usr/bin/env python3
print("Content-type: text/html\n")
print("<html><body>Python is Fabulous !</body></html>")
*printコマンドを使って、文字型・数値型を表示させるのは、print("Content-type: text/html\n")
print("<html><body>Python is Fabulous !</body></html>")
Python 3 コマンドライン 一覧
参照。サンプル・コードあり
3)ブラウザで確認。
ブラウザのURLで、http://127.0.0.1:8000 に、先程の「test.py」を設置したdirectoryを指定してアクセス。
URL : http://127.0.0.1:8000/cgi-bin/test.py
すると、
と表示され、
1) 「cgiserver.py」が、Window上でWebサーバー環境をつくり、指定したDirectory内の
「test.py」を実行。
2) 「test.py」は、記載されたスクリプトの内容を実行し、ブラウザ上に実行結果を反映。
(この場合、printコマンドを実行し、Python is Fabulous という文字列をhtml文書として
表示する。
という挙動が、上手く実行されたことが分かりました。
*3行目にContent-typeから始まる文字列を出力しています。しかし、この文字列はWebブラウザには表示されていません。この部分はヘッダと呼ばれている部分で、Webブラウザに返すレスポンスには必ず要求されるそうです。
(詳細は別途)
次に、
先程のスクリプトを修正して、もう少し複雑なプログラムを実行。
先程の test.py:
#!/usr/bin/env python3
print("Content-type: text/html\n")
print("<html><body>Python is Fabulous !</body></html>")
print("Content-type: text/html\n")
print("<html><body>Python is Fabulous !</body></html>")
修正する test.pyの内容:
現在時刻を表示させるスクリプトになります。
#!/usr/bin/env python3
import datetime
#フォーマット文字列の作成
html_body = """
<html><body>
{0.year:d}/{0.month:d}/{0.day:d} {0.hour:d}:{0.minute:d}:{0.second:d}
</body></html>"""
now=datetime.datetime.now()
print("Content-type: text/html\n")
print(html_body.format(now))
import datetime
#フォーマット文字列の作成
html_body = """
<html><body>
{0.year:d}/{0.month:d}/{0.day:d} {0.hour:d}:{0.minute:d}:{0.second:d}
</body></html>"""
now=datetime.datetime.now()
print("Content-type: text/html\n")
print(html_body.format(now))
「test.py」を上記の内容に修正後、保存し、再度、「cgiserver.py」をダブルクリックで実行します。
すると、
ところで、このテストの課程で、test.pyの内容をコピー・ペーストで実行しようとしたのですが、
最初は上手くいきませんでした。
これが、失敗した時の記述の内容。
これが、成功した時の記述の内容。
どこが違うかというと、上の失敗のものは、不必要なインデントが入っているので、Pythonが解釈できなかったようです。 Pythonは、インデントに非常にセンシティブであることを失念していました。
このように、エラーが起こったときは、
http://pythontutor.com/visualize.html#mode=edit
で、エラーチェックをしています。
とても便利です。ご参考まで。
参考)
このページは、以下のサイトを参考にしています。
とても分かり易いサイトです。 ここに記載されていない細かな内容の解説もされています。
https://coreblog.org/ats/stuff/minpy_web/03/index.html
参考にしてください。
0 件のコメント:
コメントを投稿