☆☆ 新着記事 ☆☆

2018年5月31日木曜日

Python 3 CGI Programming(2) - Text入力・ラジオボタン form = cgi.FieldStorage()


html側で組んだフォームデータを受けて、Python 3 でcgiの処理をするスクリプトを書いてみた。
フォームから、引き渡される値が何なのか、どうやって値を出すのかに非常に苦労したけど、よく分かった。 詳細は、下記参照。

(Pythonをネットで調べると、Python 2系と3系の記述が混載されていて非常に苦労する。)

1.CGIの環境設定
Python 3 CGI Programming (1) を参照。



2. 基本の Python3 スクリプト

(Python/html 基本構文)

print "Content-type: text.html\r\n\r\n"
print "<html>"
print "<head><title>My First CGI Program</title></head>"
print "<body>"
print "<p> It worked !!!</p>"

for i in range(5)
   print "<h>Hello world</h>"

print"</body>"
print"</html>"

*Python 2.7の場合、printの後は( ) で囲まなくても良いようですね。

基本は、print を使って、html文を書き出すということだと理解しました。


(基本構文)

print("Content-type: text/html; charset=UTF-8\n")
import cgi

form = cgi.FieldStorage()

htm = '''<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>py3.cgi</title>
</head>
<body>
<form method="POST">
<input type="text" name="ptest"/>
<input type="submit"/>
</form>
<div>%s</div>
</body>
</html>
'''
print(htm % form.getvalue('ptest'))


(発展)
#helloworld.py
import cgi
 
print("Content-type: text/html\r\n\r\n")
print("<html><body>")
print("<h1> Hello Program! </h1>")
# Using the inbuilt methods
 
form = cgi.FieldStorage()
if form.getvalue("name"):
    name = form.getvalue("name")
    print("<h1>Hello" +name+"! Thanks for using my script!</h1><br />")
if form.getvalue("happy"):
    print("<p> Yayy! I'm happy too! </p>")
if form.getvalue("sad"):
    print("<p> Oh no! Why are you sad? </p>")
 
# Using HTML input and forms method
print("<form method='post' action='helloworld.py'>")
print("<p>Name: <input type='text' name='name' /></p>"#テキスト入力
print("<input type='checkbox' name='happy' /> Happy")   #Radio Button
print("<input type='checkbox' name='sad' /> Sad")        #Radio Button
print("<input type='submit' value='Submit' />")
print("</form")
print("</body></html>")


(発展2)
#whichsubject.py
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb

# Create instance of FieldStorage
form = cgi.FieldStorage()


# Get data from fields
if form.getvalue('dropdown'):
   subject = form.getvalue('dropdown')
else:
   subject = "Not submitted"


print ('''
"<Content-type:text/html\r\n\r\n>"
"<html>"
"<head>"
"<title>Dropdown Box - Sixth CGI Program</title>"
"</head>"
"<body>"
''')

# html form expression
print('''
<form action = "/cgi-bin/subject.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>''')

print ("<h2> Selected Subject is %s</h2>" % subject)
print ("</body></html>")
 


3.  htmlファイル と Python3 スクリプトを分けてみる。

以上は、全て直接, pyファイルを参照しているが、次に html ファイルと pyのファイルを分けて作ってみる。


#html : calc simple.html
<!DOCTYPE html>

<html>
    <head>
        <meta charset="utf-8">
        <title>メトリック・コンバーター</title>
    </head>
    <body>
<form action = "./cgi-bin/querytest.py" method = "post">
 <p>Length: <input type='number' name='length' min='1' max='1000'/></p>
  <input type = "submit" value = "Submit"/>

</form>
 </body>

</html>



#Python 3 : querytest.py
print("Content-type: text/html; charset=UTF-8\n")
import cgi

htm = '''<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>py3.cgi</title>
</head>
<body>
%s
</body>
</html>
'''
form = cgi.FieldStorage()
print(htm % form.getvalue('length'))       #html 内に数字を渡す(?)
 


(結果)

* form.getvalue(名前)は、html (requestサイト)のName属性で受け渡しが確認できることを確認。


(更に)

#html ファイル


コマンドライン

解説

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>メトリック・コンバーター</title>
    </head>
    <body>

<form action = "./cgi-bin/querytest.py" method = "post" target = "_blank">
 <p>Unit:  <select name = "dropdown"></p>
   <option value = "null"> ----</option>
   <option value = "feet"> feet</option>
   <option value = "inch"> inch</option>
  </select>

 <p>Length: <input type='number' name='length' value='%s' min='1' max='1000'/></p>
  <input type = "submit" value = "Submit"/>
</form>

 </body>

</html> 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
#ドロップダウン 
getvalue(dropdown)の値として、Option のValueの値が格納される。
 
 
 
#テキスト・フィールド
getvalue(length)の値として、inputされた値が格納される。

 

 #Python スクリプトファイル:

記述内容


解説

 print("Content-type: text/html; charset=UTF-8\n")
import cgi

# Create instance of FieldStorage
form = cgi.FieldStorage()


if str(form.getvalue('dropdown')) == 'feet':
    num = form.getvalue('length')
    length = int(num)
    cm = length * 30.48
    print('You entered ' + str(length) + ' feet, which is  ')
    print(str(cm) + " cm")
    print(', also same as ' +str(cm/100) + " m")
 
else:
    print("I haven't done yet that far!!")


#print ("<Content-type:text/html\r\n\r\n>")
#print ("""
#       <html>
#       <head>
#       <title>Getting Tired?</title>
#       </head>
#       <body>""")
#print ("</body></html>")
# Get data from fields

 

 


ドロップダウンから渡される値(option value)が 'feet' であれば。

htmel側で入力は数値と指定しても、引き渡しは文字形式なので、数値タイプに変更。









#pythonのスクリプト側でhtmlを記載する良い方法は良く分からない。

 
結果、


(htmlサイド)

(スクリプトサイド)




p = "今回は非常に苦労した!!"
print (p*5)

今回は非常に苦労した!!今回は非常に苦労した!!今回は非常に苦労した!!今回は非常に苦労した!!今回は非常に苦労した!!"

参考)

Python3 Advanced Tutorial 7 - CGI Programming
https://youtu.be/x_1rgQwk5fM
PythonのCGIでGETやPOSTの値を受け取ってみる
http://atomiyama.com/linux/page/python-cgi-01/
CGI Programming in Python
https://www.geeksforgeeks.org/cgi-programming-python/
How to pass Drop Down Box Data to Python CGI script?
https://www.tutorialspoint.com/How-to-pass-Drop-Down-Box-Data-to-Python-CGI-script
Python - CGI Programming
https://www.tutorialspoint.com/python/python_cgi_programming.htm
input関数|Python用語辞典
https://tech-joho.info/input%E9%96%A2%E6%95%B0/
セレクトボックスを作る
http://www.tagindex.com/html_tag/form/select.html
Pythonの%演算子による文字列フォーマット
https://qiita.com/takahiro_itazuri/items/e585b46d096036bc837f


◆こんなのもある。
https://www.jiriki.co.jp/blog/python/python-postmethod-form

1.htmlサイド
<html>
<head>
<title>Form test</title>
</head>
 
<body>
<h1>Python Form test</h1><hr>
 
<form name="Form" method="POST" action="/cgi-bin/form.py">
name: <input type="text" size="30" name="name">
mail: <input type="text" size="30" name="mail">
<input type="submit" value="submit" name="button">
</form>
</body>
</html>
 
2. pyサイド
 
#!/usr/bin/env python
import cgi
 
print "Content-Type: text/html\n"
 
print "<html><body>"
 
form = cgi.FieldStorage()
form_check = 0
if form.has_key("name") and form.has_key("mail") :
  form_check = 1
if form_check == 0 :
  print "<h1>ERROR !</h1>"
else :
  print "<h2>PRINT</h2><hr>"
  print "<b>name: </b>", form["name"].value
  print "<b>mail: </b>", form["mail"].value
 
print "</body></html>"
 
◆こんなのもある。
GETメソッドとPOSTメソッドの比較
 
 

0 件のコメント:

コメントを投稿