システムプログラム(第10回): PythonによるCGIプログラムの作成

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2022/2022-07-27/cgi-python.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2022/
http://www.coins.tsukuba.ac.jp/~yas/

PythonによるCGIプログラムの作成(hello)

Python 言語でも、CGI のプログラムを作成することができる。 次のライブラリを利用すると便利である。

cgi-hello-python.cgi

cgi-hello-python.cgi は、 cgi-hello.cを Python 言語で記述したものである。関数名や変数名としては、C 言語版と似たも のを使っている。プログラムの説明は、C 言語版を見なさい。

[no-cgi/cgi-hello-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()
実行

cgi-printarg-python.cgi

cgi-printarg-python.cgi は、 cgi-printarg.ccgi-printarg-ruby.cgi を Python 言語で記述したものである。関数名や変数名としては、Ruby 言語版と似たも のを使っている。プログラムの説明は、C 言語版や Ruby 言語版を見なさい。

[no-cgi/cgi-printarg-python.cgi]

   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("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=[], attributes=[], styles=[])
  33:	
  34:	main()

cgi.FieldStorage() を利用すると、Python の辞書型のようにフォームのデー タを取得できる。添え字でのアクセスもできる。同じ名前のパラメタが複数送 られてきた場合、リストになる。以下で述べるように getfirst() を使った方 がわかりやすい。

bleach.clean() は、 html_escape() と同様に 文字列に含まれてる「<>&」等の文字を &を使ったもの 「&lt;&gt;&amp;」 に置き換える。 クライアントから送られてきた文字列をクライアントにエコーバックする時に 用いる。

CGIを実行するためのフォーム

<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>

表示例

CGI の GET メソッドを使う例

姓: 名:
C言語
Python言語
その他
電子メール:

CGI の POST メソッドを使う例

姓: 名:
C言語
Python言語
その他
電子メール:

cgi-arg1arg2-python.cgi

cgi-arg1arg2-python.cgi は、cgi-arg1arg2.cを Python 言語で記述したものである。関数名や変数名としては、C 言語版と似たも のを使っている。プログラムの説明は、C 言語版を見なさい。

[no-cgi/cgi-arg1arg2-python.cgi]

   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("arg1: [{}]".e(arg1))
  24:	    print("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=[], attributes=[], styles=[])
  32:	
  33:	main()

cgi.FieldStorage() を利用すると、フォームのデータを取得するための オブジェクトが返される。 このオブジェクトの getfirst() メソッドを使うと、 第1引数で指定された名前のパラメタが複数あったとしても 常に最初のだけを返す。 そのようなパラメタが見つからなかった時、第2引数を返す。

CGIを実行するためのフォーム

<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>

表示例

CGI の GET メソッドを使う例

arg1: arg2:

CGI の POST メソッドを使う例

arg1: arg2:


Last updated: 2022/07/06 17:40:48
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>