So-net無料ブログ作成

Python CGI で 掲示板みたいなものを作る~POST編~ [プログラム三昧]このエントリーを含むはてなブックマーク#

WS000256.png

もう、かれこれ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"入力ページは、ここにありますので、お試しください。

参考文献

確か、この本に書いてあったのだと記憶しているのですが。

Learning Python 3e (Learning)

Learning Python 3e (Learning)

  • 作者: M Lutz
  • 出版社/メーカー: Pragma
  • 発売日: 2007/11/06
  • メディア: ペーパーバック
初めてのPython 第3版

初めてのPython 第3版

  • 作者: Mark Lutz
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2009/02/26
  • メディア: 大型本

この本には、CGIの話は出てこないみたいです。

Python Cookbook 2e

Python Cookbook 2e

  • 作者: A Martelli
  • 出版社/メーカー: Pragma
  • 発売日: 2005/03/24
  • メディア: ペーパーバック

nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。