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 の正しい使用方法