SQLの窓

2020年08月19日


XAMPP + Python( 3.8 ) でWEBアプリの基礎部分構築 : その ( 2 ) : QUERY_STRING と 画面定義

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の最新記事】
posted by lightbox at 2020-08-19 10:41 | Python | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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