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>"
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'))
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>
<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 内に数字を渡す(?)
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> |
|
#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 件のコメント:
コメントを投稿