筑波大学 システム情報系 情報工学域 新城 靖 <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
https://www.coins.tsukuba.ac.jp/~syspro/2024/2024-07-31/cgi-python.html
あるいは、次のページから手繰っていくこともできます。
https://www.coins.tsukuba.ac.jp/~syspro/2024/
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>