Python: CGIスクリプトの基本(文字化け対策版)
PythonでCGIスクリプトを作成する場合は、
cgi モジュールを使用すると便利です。
さらにデバッグ用としてcgitab モジュールを使用すると、
エラー時に詳細な情報を取得できます。
作成するCGIの概要
ここでは 「HTMLフォームの入力ボックスで入力・送信された内容を表示する」 というシンプルなCGIスクリプトのコードを載せます。 文字コード指定がない場合、日本語を入力・送信すると文字化けするので その対策(utf-8 指定)もしています。
作成するファイルは次の2つです。
- sample.html
- sample.py
サーバーによっては拡張子を「.py」ではなく「.cgi」にする必要があるかもしれません。 各自でサーバーの情報を確認してください。 あと、CGIファイルに実行権限を付与するのを忘れないでください。
CGIスクリプトサンプル: HTML
HTMLは単純に入力ボックスと送信ボタンだけのシンプルな作りです。 form部分だけを表示します。
form タグに「 target="_blank"」を指定すると、 CGIスクリプトをブラウザの別タブで開くことができます。 デバッグ時はその方が便利かもしれません。
sample.html
<form action="sample.py" method="POST"> <p><input type="text" name="input1" value=""></p> <p><input type="submit"></p> </form>
CGIスクリプトサンプル: Python
Pythonファイルは次の通りです。 Pythonのパスやバージョンはサーバによって異なりますから、 各自で確認してください。
赤字の部分が日本語の文字化け対策として必要な部分です。
sample.py
#!/usr/local/bin/python3.7 import sys import io import cgi import cgitb cgitb.enable() # 送信内容を取得 storage = cgi.FieldStorage() val = storage.getvalue("input1") sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") print("Content-Type: text/html; charset=utf-8\n") print(val)
文字化け対策として必要な部分
文字化け対策として次の3行を加えます。
import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
さらに、下の行で「charset=utf-8」の指定を行ってください。
print("Content-Type: text/html; charset=utf-8\n")
Pythonファイルの別バージョン
先ほど紹介したスクリプトと、次のスクリプトはどちらも同じ結果です。 好きな方をアレンジして使ってください。
今回は「charset=utf-8」の指定をHTMLの meta タグで行っています。
sample.py
#!/usr/local/bin/python3.7 import sys import io import cgi import cgitb cgitb.enable() # 送信内容を取得 storage = cgi.FieldStorage() val = storage.getvalue("input1") sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") print("Content-Type: text/html\n") # HTML html_before = '<html><meta charset="utf-8"><body>' html_after = '</body></html>' # 表示 print(html_before) print(val) print(html_after)