Python の CGI の機能を使わずに、QUERY_STRING を使用して GET メソッドによる入力値の処理を行います。 XAMPP で Python を実行できるようにするには、httpd.conf の 『AddHandler cgi-script .cgi .pl .asp』 に .py を追加します Windows では、Python の先頭に Python の実行プログラムの場所を記述しなくても、Windows のレジストリに設定して動作できるようにする事ができるようです ( 💘 ScriptInterpreterSource Registry-Strict ) Python のダウンロードとインストールは こちら(Windows 環境のPython) がとても参考になります sample_02.py QUERY_STRING から入力値を取得する為に urllib.parse.parse_qs を使用しますが、取得されたディクショナリの key 部分にフィールド名が使用され、値の部分に配列が使用されるので少し使いづらい為、本来は cgi.FieldStorage() を使用して form の値を取得して利用します( GET と POST 混在 )fields = [ "field1", "field2", "field3" ] for field_name in fields: if form_get.get(field_name) is None: form_get[field_name] = [""]上記処理では、fields に使用する field名 を定義して、入力されなかったフィールドに対して空文字列をセットしています 画面定義に f-string を使用しています。この際注意するのは、CSS や JavaScript で使用される {} を {{}} に変更する事です
#!C:\python\python.exe import cgi import cgitb cgitb.enable() import sys import io import os import urllib.parse from xml.sax.saxutils import * 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() print( "<div style='padding:30px;font-size:20px;word-break:break-all;'>" ) # QueryString の文字列を取得します try: qs = os.environ["QUERY_STRING"] except Exception as e: qs = "" # QueryString の文字列です print(qs + "<br>") # 値が無い場合は、エントリは作成されません form_get = urllib.parse.parse_qs(qs) # qs が空文字列の場合は form_get は {} となります print(str(form_get) + "<br>") # このリストのデータを キーに持つディクショナリ(form_get)を確実に作成します # form_get は、値が全て配列で、通常 [0] の値を使用します fields = [ "field1", "field2", "field3" ] for field_name in fields: if form_get.get(field_name) is None: form_get[field_name] = [""] # 以降で使用可能なディクショナリの内容です print(str(form_get) + "<br>") print( "</div>" ) view = f"""<!DOCTYPE html> <html> <head> <meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"> <meta charset="UTF-8"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"> <style> #main {{ padding: 30px; font-size: 24px; }} form {{ margin-bottom: 20px; }} .inline {{ display: inline-block; }} .ttl {{ width: 100px; }} </style> </head> <body> <div id="main"> <form method="get"> <div> <div class="inline ttl">氏名</div> <div class="inline"><input type="text" name="field1" value="{form_get["field1"][0]}"></div> </div> <div> <div class="inline ttl">フリガナ</div> <div class="inline"><input type="text" name="field2" value="{form_get["field2"][0]}"></div> <div class="inline ml-2"><input type="submit" name="send" value="送信"></div> </div> </form> </div> </body> </html>""" print(view)
f-string を使用せずに別ファイルにして import する こうすると、f-string の使えないバージョンの python でも利用できます。また外部ファイルにする事によって、埋め込まれた内容がわかりにくくなる事を避ける事ができますimport sample_02_view print( sample_02_view.html.format( form_get["field1"][0], form_get["field2"][0]) )sample_02_view.py
html = """<!DOCTYPE html> <html> <head> <meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"> <meta charset="UTF-8"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"> <style> #main {{ padding: 30px; font-size: 24px; }} form {{ margin-bottom: 20px; }} .inline {{ display: inline-block; }} .ttl {{ width: 100px; }} </style> </head> <body> <div id="main"> <form method="get"> <div> <div class="inline ttl">氏名</div> <div class="inline"><input type="text" name="field1" value="{}"></div> </div> <div> <div class="inline ttl">フリガナ</div> <div class="inline"><input type="text" name="field2" value="{}"></div> <div class="inline ml-2"><input type="submit" name="send" value="送信"></div> </div> </form> </div> </body> </html>"""
関連する記事 XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 ) XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義 XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力
|
【Pythonの最新記事】
- Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- Python : shift_jis の3列の csv フォーマットのデータを ttk.Treeview に表示する
- Python : ttk.Treeview で表形式を使用して環境変数の一覧表示
- XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 1 )
- XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 4 ) : リダイレクトと関数とログ出力
- XAMPP + Python( 3.8 ) で WEBアプリの基礎部分構築 : その ( 3 ) : cgi.FieldStorage() から ディクショナリ
- Python + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート
- MySQL Connector/Python の使用方法概要のまとめ
- Python3 : 言語的デザインの特徴と要点
- Python ドキュメントに沿った、テキストファイル読み込みの理解
- Python3 でメール送信 ( さくらインターネット )
- Python 3.6 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました
- Eclipse + Python(Pydev) : pywin32(COM使用の為) + MySQL Connector/ODBC でループ処理をしながら更新
- Eclipse + Python(Pydev) : MySQL Connector/Python でループ処理をしながら更新
- Pleiades Eclipse 4.7 Oxygen で Python を使って MySQL にアクセスする
- Python 3.4 : インストールと最初にする事( Windows )
- Python3.x : URL を読み出す( bytes から string )
- Python3.1 : URLを読み出して、バイナリのままファイル出力する
- Python3.1 : クッキーを保持して二つの URL にアクセスする
- Python3.1 : URLを読み出してファイルに出力