python-cgi どのボタンが押されたのかを知る コード全文

Python活用

呼び出し側のページに複数のボタンがあるとき、どのボタンが押されたのかを判断するコード例を紹介します。
このコードは実際にサーバーに設置しているものです。
こちらのページでさくらのレンタルサーバーでの動作を実際に見ることができます。
文法的な解説はこちらのページで行っています。

呼び出し側HTML

<html>
  <head>
    <meta charset=utf-8>
    <title>Sample</title>
  </head>
  <body>
    <form action=/it/python/btn/cast.cgi method=post>
     <p><textarea id="copyTarget" cols="20" name="text" rows="10" wrap="off">Hello World
Hello World
Hello World</textarea></p>
     <p><button name="button" value="kon">こんにちは</button> <button name="button" value="seka">世界</button></p>
    </form>
  </body>
</html>

cgiのコード

#!/usr/local/bin/python
#coding: utf-8
import cgi,sys,io

form = cgi.FieldStorage()
text = form.getvalue('text', '')      #複数行テキストボックス(textarea)の値
button = form.getvalue('button', '')  #ボタンの値

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


#ボタンが2つの場合

if button == "kon":        #if文の最後の:を忘れないこと
    aisatsu="こんにちは"   #ブロック内はスペース4個インデントする ブロック内に空白行を入れない         
    sekai = "World"
else:                      #elseの後の:を忘れないこと
    aisatsu="Hello"
    sekai = "世界"


#ボタンが3つ以上ある場合

if button == "kon": 
    aisatsu="こんにちは"           
    sekai = "World"
elif button == "seka":                 
    aisatsu="Hello"
    sekai = "世界"
elif button == "gdgd":                 
    aisatsu="Hel"
    sekai = "地獄"

print('Content-Type: text/html; charset=UTF-8\n')

print("実行結果<BR>")

stringlist = text.split("\n")  #複数行テキストボックスの内容を行ごとに配列化(改行記号で区分けする)

print("stringlist = ")
print(stringlist)
print("<BR>")

index=[]                                #配列の宣言
i = 0
for line in stringlist:                 #stringlistの要素数だけforループ  lineには都度stringlistの各要素の文字列が入る
    if line[0:5]=="Hello" and i > 0:    #最初の5文字で判定 
        line=line.replace("Hello",aisatsu)    #.replace で置換された文字列を与える 代入文にしないとlineの値は変化しないので注意
    index.append(line)                        #.append で配列要素を追加する
    i = i + 1         
 
print("index = ")
print(index)
print("<BR>")

array=[] 
for i in range(len(index)):                #indexの要素数だけforループ  今何行目か知る必要があるときに使う  range(len()) で0から最後までという意味
    str = index[i]
    if "World" in str and i > 0:           #その文字が含まれているかを in で判定する
        str = str.replace("World",sekai)              #6文字目までを削除
    if i != 2:                         # != は not == にしても同じ
        array.append(str)

print("array = ")
print(array)
print("<BR>")

#ここより上のprint()は、本番ではコメントアウトする(頭に#を付ける)
#要所要所にprint()を入れておくとエラーの発生カ所を特定しやすい


#出力するHTML

html_body1 = """
<!DOCTYPE html>
<html><meta charset="UTF-8" >
<head>
<title>python cgi sample</title>
</head><body><P><H3>実行結果</H3></P><p><textarea id="copyTarget" wrap="off"  rows="8" cols="20">"""


html_body2 = """
    </textarea></p>
    <!-- コピー対象要素とコピーボタン -->
    <button onclick="copyToClipboard()">コピー</button>
    <script>
        function copyToClipboard() {
            // コピー対象をJavaScript上で変数として定義する
            var copyTarget = document.getElementById("copyTarget");

            // コピー対象のテキストを選択する
            copyTarget.select();

            // 選択しているテキストをクリップボードにコピーする
            document.execCommand("コピー");

        }
    </script>

</body>
</html>
"""

print(html_body1)

for line in array:
    print(line) 

print(html_body2)
タイトルとURLをコピーしました