筑波大学 システム情報系 情報工学域
新城 靖
<yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
https://www.coins.tsukuba.ac.jp/~syspro/2025/2025-07-30/cgi-python.html
あるいは、次のページから手繰っていくこともできます。
https://www.coins.tsukuba.ac.jp/~syspro/2025/
http://www.coins.tsukuba.ac.jp/~yas/
Python 言語でも、CGI のプログラムを作成することができる。 次のライブラリを利用すると便利である。
1: #!/usr/local3/coins/linux/bin/python3
2: # -*- coding: utf-8 -*-
3: # cgi-hello-python.cgi -- 簡単な CGI のプログラム (Pyton版)
4: # ~yas/syspro/www/cgi-hello-python.cgi
5:
6: def main():
7: print_header()
8: print_content()
9: exit(0)
10:
11: def print_header():
12: print("Content-Type: text/html")
13: print("")
14:
15: def print_content():
16: print("<HTML><HEAD></HEAD><BODY>")
17: print("hello.")
18: print("</BODY></HTML>")
19:
20: main()
実行
1: #!/usr/local3/coins/linux/bin/python3
2: # -*- coding: utf-8 -*-
3: # cgi-printarg-python.cgi -- CGI プログラムに対する引数を表示するプログラム
4: # ~yas/syspro/www/cgi-printarg-python.cgi
5:
6: import cgi
7: import bleach
8:
9: def main():
10: print_header()
11: print_content()
12: exit(0)
13:
14: def print_header():
15: print("Content-Type: text/html")
16: print("")
17:
18: def print_content():
19: print("<HTML><HEAD></HEAD><BODY><PRE>")
20: qh = cgi.FieldStorage(keep_blank_values=True)
21: i = 0
22: for name in qh:
23: val = qh[name].value
24: print(f"qv[{i}]: {e(name)}={e(val)}")
25: i = i + 1
26: print("</PRE></BODY></HTML>")
27:
28: def e(s):
29: if s is None:
30: return "(null)"
31: else:
32: return bleach.clean(s, tags=[])
33:
34: main()
cgi.FieldStorage() を利用すると、Python の辞書型のようにフォームのデー タを取得できる。添え字でのアクセスもできる。同じ名前のパラメタが複数送 られてきた場合、リストになる。以下で述べるように getfirst() を使った方 がわかりやすい。
bleach.clean() は、 html_escape() と同様に 文字列に含まれてる「<>&」等の文字を &を使ったもの 「<>&」 に置き換える。 クライアントから送られてきた文字列をクライアントにエコーバックする時に 用いる。
<H2><A ID="cgi-example-get">CGI の GET メソッドを使う例</A></H2>
<FORM ACTION="cgi-printarg-python.cgi" method="get">
<P>
姓: <INPUT type="text" name="lastname">
名: <INPUT type="text" name="firstname"><BR>
<INPUT type="radio" name="lang" value="C"> C言語 <BR>
<INPUT type="radio" name="lang" value="Python"> Python言語 <BR>
<INPUT type="radio" name="lang" value="others"> その他 <BR>
電子メール: <INPUT type="text" name="email"><BR>
<INPUT type="submit" value="send"> <INPUT type="reset">
</P>
</FORM>
<H2><A ID="cgi-example-post">CGI の POST メソッドを使う例</A></H2>
<FORM ACTION="cgi-printarg-python.cgi" method="post">
<P>
姓: <INPUT type="text" name="lastname">
名: <INPUT type="text" name="firstname"><BR>
<INPUT type="radio" name="lang" value="C"> C言語 <BR>
<INPUT type="radio" name="lang" value="Python"> Python言語 <BR>
<INPUT type="radio" name="lang" value="others"> その他 <BR>
電子メール: <INPUT type="text" name="email"><BR>
<INPUT type="submit" value="send"> <INPUT type="reset">
</P>
</FORM>
1: #!/usr/local3/coins/linux/bin/python3
2: # -*- coding: utf-8 -*-
3: # cgi-arg1arg2-python.cgi -- CGI プログラムに対する引数 arg1 と arg2 を表示するプログラム
4: # ~yas/syspro/www/cgi-arg1arg2-python.cgi
5:
6: import cgi
7: import bleach
8:
9: def main():
10: print_header()
11: print_content()
12: exit(0)
13:
14: def print_header():
15: print("Content-Type: text/html")
16: print("")
17:
18: def print_content():
19: print("<HTML><HEAD></HEAD><BODY><PRE>",flush=True)
20: qh = cgi.FieldStorage(keep_blank_values=True)
21: arg1 = qh.getfirst("arg1","")
22: arg2 = qh.getfirst("arg2","")
23: print(f"arg1: [{e(arg1)}]")
24: print(f"arg2: [{e(arg2)}]")
25: print("</PRE></BODY></HTML>\n")
26:
27: def e(s):
28: if s is None:
29: return "(null)"
30: else:
31: return bleach.clean(s, tags=[])
32:
33: main()
cgi.FieldStorage() を利用すると、フォームのデータを取得するための オブジェクトが返される。 このオブジェクトの getfirst() メソッドを使うと、 第1引数で指定された名前のパラメタが複数あったとしても 常に最初のだけを返す。 そのようなパラメタが見つからなかった時、第2引数を返す。
<H2><A ID="cgi-example-get">CGI の GET メソッドを使う例</A></H2>
<FORM ACTION="cgi-arg1arg2-python.cgi" method="get">
arg1: <INPUT type="text" name="arg1">
arg2: <INPUT type="text" name="arg2">
<INPUT type="submit">
<INPUT type="reset">
</FORM>
<H2><A ID="cgi-example-post">CGI の POST メソッドを使う例</A></H2>
<FORM ACTION="cgi-arg1arg2-python.cgi" method="post">
arg1: <INPUT type="text" name="arg1">
arg2: <INPUT type="text" name="arg2">
<INPUT type="submit">
<INPUT type="reset">
</FORM>