PythonでWebプログラミングの基礎(その2)CGIで動的ページの表示

前回の続きです。前回はPythonでWebサーバを起動してその動作を確認しました。表示したのはHello World!という文字列のみですが、これは静的ページと言えます。毎回同じ内容が表示されるということです。

今回はそれに対して動的ページ(毎回表示内容が違う)として現在時刻を表示してみます。この動的ページ生成の方法としてサーバサイドで動作するCGI(Common Gateway Interface)という仕組みを使います。

CGIとは
CGIとはCommon Gateway Interfaceの略でwikipediaのページから引用させて頂きますと以下にようになります。

Common Gateway Interface(コモン・ゲートウェイ・インタフェース、CGI)は、ウェブサーバ上でユーザプログラムを動作させるための仕組み。現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。

以下のような「仕組み」です。
「ユーザプログラム」がWebサーバの「外部プログラム(外部プロセス)」として動作する。その「ユーザプログラム」とWebサーバの連動でHTMLのページ(動的ページ)を生成する。

また、「ユーザプログラム」のプログラミングはどの言語(標準入出力と環境変数が扱えれば)でも実行出来る。

現在では必ずしもCGIを使った動的ページの生成(大きく表現するとWebアプリケーション)は主流ではありません。大きな理由は、アクセスが多くなれば「外部プログラム」を多数起動することになりOSに負荷がかかるということです。あとセキュリティの観点もあります。

それでは現在の主流は何かというと、Webサーバの「内部プログラム(内部プロセス)」がそのWebアプリケーションの処理を行っているという手法です。

ここではひとまずCGIを使ってみますので、このあたりの解説が必要であれば、例えばですが、以下がよくまとまっていると思います。
JavaによるWebアプリケーションの仕組みをざっくり説明

それではなぜCGIを使うのか
それではなぜCGIを使うのかというと、プログラミングの勉強と基本的なWebの仕組みを同時に理解するのに適していると思うからです。以下の点です。
Pythonを使えばPythonだけで実行環境が出来る。
標準入出力を使うので画面に表示する感覚でブラウザに表示出来る。

実際にやってみます
現在時刻の動的ページ生成を実際にPythonでやってみます。ディレクトリの位置が合わないと実行出来ないので長くなるかもしれないですが、念のため順番に書きます。

Webサーバのホームディレクトリを決める
私の場合は前回の場所でログインディレクトリ配下のwebserverというディレクトリです。どこでもいいので決めて下さい。

cgi-binディレクトリを作成する
この配下にcgi-binというディレクトリを作成します。cgi-binという決まったディレクトリ名です。そのcgi-binディレクトリに移動します。

cgi-bin配下にPythonプログラムを作成
以下のプログラムを作成します。ファイル名はここではnow.pyとします。nanoエディタで編集、保存出来ます。

#!/usr/bin/env python3

htmlText = '''Content-type: text/html; charset=UTF-8

<html>
<head>
  <title>現在時刻を表示する</title>
</head>
<body>
<h1>現在時刻</h1>
<p>%s</p>
</body>
</html>
'''

import time
now = time.strftime('%Y年%m月%d日 %H時%M分%S秒')
print(htmlText % now)

作成したpythonプログラムに実行権限を付加します。
$ sudo chmod +x now.py

Webサーバのホームディレクトリに戻ります。

pythonでWebサーバを起動します。
このディレクトリで以下のように起動します。–cgiを付けて下さい。-(ハイフン)は2個です。
$ python3 -m http.server –cgi

ブラウザからアクセスします。
URLに以下を入力します。
http://localhost:8000/cgi-bin/now.py

現在時刻が表示されました。うまく表示出来ない場合は手順のどこかが抜けたかPythonプログラムの書き間違いか何かだと思います。見直してみて下さい。

プログラムの説明
分かりやすいと思うのですがいかがでしょうか。
現在時刻を含むHTMLテキスト(変数名htmlText)を生成して、print()で表示するという処理です。これがcgiでブラウザに表示されます。

1行目はpython3で実行すると意味でcgiでは必須です。

長い文字列の書き方
ここではHTMLテキストの長い文字列をヒアドキュメントという書き方で書いています。 ”’と”’で囲まれた部分です。他にも長い文字列の書き方はいろいろとありますが、ここではヒアドキュメントを使いました。

以下に説明がありました。
Pythonのヒアドキュメント

まとめ的に
以上でPythonを使ってCGIで動的ページの表示が出来ました。実際にはここから前回やったような静的ページからのcgiプログラムの呼び出しや連携をやっていく必要があります。また前回も書きましたが、このベースにはインターネットのプロトコル(通信規約)のTCP/IPが存在します。このTCP/IPのWebサーバに関連する部分を理解していく必要があります。

次回はそのあたりを書きます。次回へ進む