ホーム > カテゴリ > Python・人工知能・Django >

Web版のHello WorldとGET/POST [Python]

Python/TensorFlowの使い方(目次)

PythonでのWeb版の「Hello World」と「GET/POST」を扱います。PHPのhtmlspecialchars()に相当するXSS対策(クロスサイトスクリプティング)なども行っているので、これだけ覚えれば後はOKです。

1. Hello World

[Python2]

#!/usr/local/bin/python

print 'Content-type: text/html; charset=UTF-8\n'
print 'Hello World!'

[Python3]

#!/usr/local/bin/python3

print ('Content-type: text/html; charset=UTF-8\n')
print ('Hello World!')

1行目の「実行パス」は各レンタルサーバーによって異なります。参考
ファイルのパーミッションは700 or 755です。
文字コードは「UTF8」。改行コードは「LF」にします。改行コードが「CR+LF」だと「500 Internal Server Error」となります。
ファイルの拡張子が「*.cgi」ではなく「*.py」で実行する場合は「.htaccess」を作成して次のコードを記述します。そのファイルは*.pyファイルと同じフォルダに置いてください。
AddHandler cgi-script .py

2. GET/POST

次のコードの初期状態はGETを使用しています。POSTを使用したい場合は24行目のmethod="get"をmethod="post"に変更してください。

[test.py]

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import cgi, os, io, sys

try:
    # print()などで使用するエンコードをUTF8にする
    sys.stdin  = io.TextIOWrapper(sys.stdin.buffer , encoding='utf-8')
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
    
    # Content-typeの設定
    print ('Content-type: text/html; charset=UTF-8\n')

    # HTML文字列
    html = '''
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    {}
    <form name="main" action="test.py" method="get">
        <input type="text" name="txt_box" value="プチモンテ">
        <button>送信する</button>
    </form>  
  </body>
</html>
'''

    # フォームデータを取得する
    form = cgi.FieldStorage()
    if(form):
        # リクエストの種類
        msg = "[" + os.environ['REQUEST_METHOD'] + "]<br>"
        
        # フォームデータの出力
        for key in form:
            # cgi.escapeはPHPのhtmlspecialchars()と同様
            msg += key + "=" + cgi.escape(form[key].value) + "<br>"
        print(html.format(msg))
    else:
        print(html.format(''))

# エラーとエラー行を表示する
except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    print("line:",exc_tb.tb_lineno, "'", exc_type.__name__, "'", "<br>")
    print(e)

cgi.escapeでXSS対策。try..exceptでエラーを表示するようにしています。

エラーを確認したい方は9行目をコメントにしてください。次のようなエラーが表示されます。

line: 44 ' UnicodeEncodeError '
'ascii' codec can't encode characters in position 186-190: ordinal not in range(128)

html変数にUnicodeの日本語があるので、エンコードエラーが発生します。





関連記事



公開日:2018年07月10日 最終更新日:2018年08月24日
記事NO:02696