SQLの窓

2018年04月14日


Python 3.6 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました

Eclipse で実行させるのと、WWWサーバー( ここでは AN HTTP Server )で実行させるのとでは、やはりもっといろいろな切り口の理解が必要になります。

とにかく、CGI としてベタな QUERY_STRING を使用してベタな format で作成後、f-stringヒアドキュメントで HTML 部分を簡潔にして、最後に cgi モジュールで GETとPOST を兼用にしました。(FieldStorage() の戻りの内容が変更できないようなので、単純な dict に入れ替えています。)

▼ GET/POST 共用 : 結局 cgi モジュール で作成 : f-string ヒアドキュメント埋め込み
import cgi
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

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

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
print()

form = cgi.FieldStorage()

fields = {}
fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if value not in form:
		fields[value] = ""
	else:
		fields[value] = form[value].value

out_client = f"""<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form method="post">
		<p>氏名 : <input type="text" name="{fld_names["氏名"]}" value="{fields[fld_names["氏名"]]}"></p>
		<p>フリガナ : <input type="text" name="{fld_names["フリガナ"]}" value="{fields[fld_names["フリガナ"]]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

print(out_client)

▼ GET のみ f-string を使った、ヒアドキュメント埋め込み
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

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

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
print()

try:
	qs = os.environ["QUERY_STRING"]
except KeyError as e:
	qs = ""

get =  urllib.parse.parse_qs(qs)

fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if get.get(value) is None:
		get[value] = [""]

out_client = f"""<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form>
		<p>氏名 : <input type="text" name="{fld_names["氏名"]}" value="{get.get(fld_names["氏名"])[0]}"></p>
		<p>フリガナ : <input type="text" name="{fld_names["フリガナ"]}" value="{get.get(fld_names["フリガナ"])[0]}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

print(out_client)

▼ GET のみ : format を使った、クォートの作成が面倒な埋め込み
import cgitb
cgitb.enable()

import sys
import io
import os
import urllib.parse

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

print("Content-Type: text/html; charset=utf-8")
print( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" )
print( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" )
print( "Pragma: no-cache" )
print()

try:
	qs = os.environ["QUERY_STRING"]
except KeyError as e:
	qs = ""

get =  urllib.parse.parse_qs(qs)

fld_names = {"氏名": "field1", "フリガナ":"field2"}
for value in fld_names.values():
	if get.get(value) is None:
		get[value] = [""]

out_client = """<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<form>
		<p>氏名 : <input type="text" name=\"""" + fld_names["氏名"] + """\" value="{""" + fld_names["氏名"] + """}"></p>
		<p>フリガナ : <input type="text" name=\"""" + fld_names["フリガナ"] + """\" value="{""" + fld_names["フリガナ"] + """}"></p>
		<p>送信 : <input type="submit" name="send" value="送信"></p>
	</form>
</body>
</html>"""

out_client = out_client.format(
	field1=get.get(fld_names["氏名"])[0],
	field2=get.get(fld_names["フリガナ"])[0]
)

print(out_client)

AN HTTP Server の設定



テストにはまだまだ使える(重宝する) AN HTTP Server の正しい使用方法



タグ:Python CGI
【Pythonの最新記事】
posted by lightbox at 2018-04-14 21:19 | Python | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり