Python CGI で 掲示板みたいなものを作る~POST編~ [プログラム三昧]
もう、かれこれ3ヶ月も前になりますが、Python CGI で 掲示板みたいなものを作るで”GET”メソッド使った「掲示板みたいなもの」を作りました。
そして、先日の事です。 某BLOGより私の記事にリンクが張られていることに気が付きました。 そのBLOGのとある記事では、Python CGIで"POST"メソッドを使う方法を探しておられるらしい。 これは、私が以前見つけた方法と違うみたいですね。
FORMの構成
FORMを配置したHTML文書は、こうなりました。 実は、"GET"メソッドを使う場合とほとんどおなじなんです。
- タイトルを"VISITOR WORLD 3"から"VISITOR WORLD 4"に変えました。
- FORMから呼び出すCGIファイルを"visitor_world3.cgi"から"visitor_world4.cgi"に変えました。
- FORMで使用するメソッドを"get"から"post"に変えました。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <!-- $Id: visitor_world4.html,v 1.1 2009/06/05 13:37:46 noritan Exp $ --> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" > <head profile="http://www.w3.org/2005/10/profile"> <title>VISITOR WORLD 4</title> </head> <body> <h1>VISITOR WORLD 4</h1> <form action="./visitor_world4.cgi" method="post"> <div> <textarea name="message" rows="4" cols="40"></textarea> </div> <p> <input type="submit" value="Submit" /> <input type="reset" value="Clear" /> </p> </form> </body> </html>
queryを受け取る方法
CGI ファイルの方も大きく変更はしていません。 "GET" メソッドの場合には、環境変数 "QUERY_STRING" から query を引っ張り出していましたが、 "POST" メソッドの場合には、標準入力 "stdin" から query を引っ張り出します。
- GET
# Get and parse a query string query_string_key = 'QUERY_STRING' if query_string_key in os.environ: query = cgi.parse_qs(os.environ[query_string_key]) else: query = {}
- POST
# Get a POST data. content_length = int(os.environ['CONTENT_LENGTH']) query = cgi.parse_qs(sys.stdin.read(content_length))
タイトルを変更した以外の違いは、これだけです。 "GET" でも "POST" でも、最終的に query を作るのは、 "cgi.parse_qs()" メソッドです。
CGIの出来上がり
という訳で、今回も以前と同じデータベースファイルに記録を残していきます。
#!/usr/local/bin/python # $Id: visitor_world4.cgi,v 1.1 2009/06/05 13:37:46 noritan Exp $ import os import sys import cgi import urllib import time # Show error as a page description. sys.stderr = sys.stdout # Database releated information db_file = "visitor.sqlite" table_name = "visitor" command = "/usr/local/bin/sqlite3 %s" % (db_file) # Get a POST data. content_length = int(os.environ['CONTENT_LENGTH']) query = cgi.parse_qs(sys.stdin.read(content_length)) # Get Current time now = time.time() # Get and escape a MESSAGE message_key = 'message' if message_key in query: message = urllib.quote(cgi.escape(query[message_key][0])) else: message = "" # Compose a SQL sql = "SELECT time, description FROM %(table)s ORDER BY time DESC;" if len(message) > 0: sql = \ "INSERT INTO %(table)s VALUES (%(now)f, \"%(message)s\");\n" \ + sql # Show HTML header print """Content-type: text/html <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > <head profile="http://www.w3.org/2005/10/profile"> <link rel="icon" href="/favicon.png" type="image/png" /> <title>VISITOR WORLD 4</title> </head> <body> <h1>VISITOR WORLD 4</h1> """ # Access to the DATABSE (pipe_out, pipe_in) = os.popen2(command) pipe_out.write( sql % {"table":table_name, "now":now, "message":message} ) pipe_out.close() # Show a list of visitor record print """<dl> """ # Make a list of messages try: for line in pipe_in: field = line.split("|") asctime = time.strftime( "%Y-%m-%d (%A) %H:%M:%S", time.localtime(float(field[0])) ) message = urllib.unquote(field[1]) print "<dt>%s</dt><dd>%s</dd>\n" % (asctime, message) finally: pipe_in.close() # Show footer print """ </dl> </body> </html> """
"cgi.FieldStorage()" という手も、あるらしいので、後で調べてみます。
参考サイト
- VISITOR WORLD 4
- "FORM"入力ページは、ここにありますので、お試しください。
参考文献
確か、この本に書いてあったのだと記憶しているのですが。
この本には、CGIの話は出てこないみたいです。
コメント 0