【python】動的な Web ページを作る

最近の Web API は高機能な物が多いですね。
なんでもかんでも、見知った言語だけで対応するというの難しくなってくるかもしれない…と日々不安を抱えています。

難しい処理をする環境が揃っている言語と言えば、 python をよく聞きます。
python は Web にも明るく、Djangoflask のような Web フレームワーク を用いれば、比較的簡単にWeb API の環境を用意出来ます。
とはいえ、原始的な方法で理屈を学ぶのも初学者にとって重要な事です。

さて、
今回は python と Web の連携について、基本的な部分の内容です。
この記事では、 python でサーバーサイドの処理をする方法について記載します。

静的な html ページをブラウザで表示

まず、静的な html を表示できる事を確認します。

次のようなhtmlを用意します。

<html>
    <head>
        <title>サンプルページ</title>
    </head>
    <body>
        <h1>見出し</h1>
    </body>
</html>

Web サーバーを立てる

先ほど作成したファイルを格納し、次のような構成にします。
htdocs をドキュメントルートとして扱う想定です。

htdocs
└─index.html

Python にはデフォルトで Web サーバーを立てる機能(phpで言う、ビルドインサーバー)があります。
初期状態でもWeb サーバーを立ち上げる事が出来ます。

docs.python.org

次のコマンドで Web サーバーを立ち上げます。

PS > python -m http.server --directory 
.\htdocs 8080

立ち上げると、http:localhost:8080 にブラウザからアクセスできるようになりますので、アクセスして確認します。

動的な html ページをブラウザで表示

本題の動的な要素です。

動的に処理するための Web サーバー立ち上げ

先述の方法はあくまで html を出力するためのサーバーでしたので、pythonの処理を書いても読み込むことは出来ません。
CGI ハンドラを設定して、外部プログラムを読めるようにします。

server.py と言う名前で次の処理ファイルを追加します。

from http.server import HTTPServer, CGIHTTPRequestHandler

# CGI ハンドラの設定 
httpd = HTTPServer(("127.0.0.1", "8080"), CGIHTTPRequestHandler)
httpd.serve_forever()

CGI ハンドラを設定して、python(.py)を処理できるようにします。
初期設定では、同じフォルダ階層の「cgi-bin」と言うディレクトリのみ対象になっています。
python ファイルを扱いたい場合は、cgi-bin ディレクトに入れる必要があります。

処理ファイルの用意

index.html を読み込んで、現在日時を表示するスクリプトを描きます 考え方は PHP と同じで、HTMLタグの中に Python の変数や関数を埋め込んで表示します。

変数を埋め込んだ html ファイルを用意

先ほどのhtmlに手を加えて、現在日時を表示できるようにします。

<html>
    <head>
        <title>サンプルページ</title>
    </head>
    <body>
        <h1>現在日時</h1>
        <p>${now}</p>
    </body>
</html>

python の処理ファイル作成

ブラウザからアクセスする処理ファイル作成します。

html ファイルを読み込んで、埋め込まれた変数を置換した文字列を作成し、 html として出力する処理を作成します。
ファイル名は、index.py とします。

import datetime
from string import Template

# 現在時刻を文字列で取得
nowDate = datetime.datetime.now().strftime('%Y年%m月%d日');

# html を読み込み テンプレート文字列 にする
file = open('./index.html', 'r', encoding="utf-8")
rowData = file.read()
data = Template(rowData)
file.close()

# HTML用のヘッダー情報とページの内容を出力
print('Content-type: text/html\n')
print(data.substitute(now=nowDate))

埋め込んだ変数への代入は、テンプレート文字列を用いています。
docs.python.org

CGIの対象ディレクトリ(cgi-bin )に格納する必要がありますので、ディレクトリの中に格納します。

サーバー立ち上げ

現状で次のようなファイル構成になっている状態です。

htdocs
│  index.html
│  server.py
│
└─cgi-bin
        index.py

先ほどは、http.server メソッドをそのまま呼び出しましたが、今回は server.py を呼び出してweb サーバーを立ち上げます。

PS > cd htdocs
PS > python server.py

これで、htdocs 配下がドキュメントルート扱いになりました。
CGI ディレクトリに保存した python ファイルをブラウザで表示します。

ブラウザで http://localhost:8080/cgi-bin/index.py を検索すると python の変数に文字列が代入されている事が確認できます。



以上です。

実際は、Web サーバー用のミドルウェアを用いてCGI の設定をするかと思いますので、この方法は現実的では無いかもしれません。

初めて Web アプリケーションを作る人が原理を理解するきっかけになれば幸いです。

©︎2017-2018 WebSandBag