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)
Python