Web版のHello WorldとGET/POST [Python]
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)
'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