Pythonでウェブサーバの構築

Image from Gyazo

Pythonのインストール

本講義ではデータベースと連携したウェブサイトを構築します. 本来は,Apacheなどのソフトウェアを利用してウェブサーバを構築する必要がありますが, ここではPythonのhttp.serverモジュールを利用してローカル環境の簡易ウェブサーバとします.

それでは,Pythonのインストール・パッケージをダウンロードしてください. このとき,Pythonのバージョンは3.xを選択してください. インストールを始める前に,ファイルをインストールするためのフォルダを作成します. 大学で環境を構築する場合は,Hドライブ に,MyPythonという名前でフォルダを作成してください (人工知能など他の授業で既にインストール済みの場合は作業は不要).

それでは,インストーラを実行しましょう. Customize installationを選択し, パッケージ管理システムの pip が同時にインストールされることを確認してください.

Image from Gyazo

Image from Gyazo

このとき,インストールするフォルダは,上記で作成したH:\MyPythonとすることに注意してください.

Image from Gyazo

インストールが終了すると,下記のダイアログが表示されます. Closeを選択して,ダイアログを閉じてください.

Image from Gyazo

最後に,インストールしたPythonへのパスを 環境変数 に追加します. 任意のフォルダで,パワーシェルを起動して,下記コマンドが実行できれば準備OKです.

% python -V
Python 3.7.4

ウェブサーバの構築

Pythonを利用してウェブサーバを構築します. 作業用の空のフォルダ sugiten を作成し, パワーシェルを起動して,下記のコマンドを実行してください.

% python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

これで,ローカル環境でウェブサーバが起動しています. ブラウザでhttp://0.0.0.0:8080/にアクセスしてみましょう. 下記の画面が表示されていればOKです.

Image from Gyazo

次に,新規にindex.html を作成し,sugitenフォルダに配置します. index.htmlには下記のコードを記述します. タイトルやヘッダに 椙天市場 という文字列を設定しています.

<!DOCTYPE html>

<html>

  <head>
    <meta charset="utf-8">
    <title>椙天市場</title>
  </head>

  <body>
    <h1>椙天市場</h1>
  </body>

</html>

ブラウザでhttp://0.0.0.0:8080/にアクセスすると, 下記の画面が表示されます.

Image from Gyazo

CGIの設定

データベースを操作するには,CGI(Common Gate Interface) を有効にする必要があります. CGIとは,ウェブサーバが外部プログラム(ここでPython)を呼び出す仕組みのことです. 新規に server.py を作成し,sugitenフォルダに配置します. server.pyには下記のコードを記述します. ここではポート番号やIPアドレスを指定しています. また,sugitenフォルダに,新規に cgi-bin フォルダ作成します. このフォルダにCGIのプログラムを配置します.

from http.server import HTTPServer, CGIHTTPRequestHandler

class Handler(CGIHTTPRequestHandler):
    # CGIを設置するディレクトリ
    cgi_directories = ["/cgi-bin"]

# ポート番号
PORT = 8080

# IPアドレス
HOST = "127.0.0.1"

# URLを表示
print("http://127.0.0.1:8080/")

# サーバの起動
httpd = HTTPServer((HOST, PORT), Handler)
httpd.serve_forever()

先程と同様にパワーシェルで下記のコマンドを実行してください. ブラウザにindex.htmlが表示されます.

% python server.py
http://127.0.0.1:8080/

次にPythonでCGIのプログラムを作成します. 新規に users.py を作成し,cgi-binフォルダに配置します. users.pyには下記のコードを記述します(ユーザの一覧情報を表示させるために用いる).

#!/usr/bin/env python

print ("Content-type:text/html\n\n")

print("<!DOCTYPE html>")
print("<html>")

print("<head>")
print("<meta charset='utf-8'>")
print("<title>ユーザ情報</title>")
print("</head>")

print("<body>")
print("<h1>ユーザ情報</h1>");
print("</body>")

print("</html>")

このファイルに実行権限を付与します. macOSの場合は下記のように chmod コマンドを用いて権限を変更します.

% chmod 755 users.py

また,index.htmlのbodyタグに,user.pyへのリンク文字列を追加します.

<body>
  <h1>椙天市場</h1>

  <ul>
    <li><a href="cgi-bin/users.py">ユーザ情報</a></li>
  </ul>  
</body>

Image from Gyazo

ユーザ情報へのリンクをクリックして,下記のページが表示されれば, CGIが問題なく動作していることになります.

Image from Gyazo

日本語が文字化けするとき

PythonのCGIプログラムが文字化けするときは,下記のコードを先頭に追加してください.

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

参考書籍