Python CGI で来客記録をつける [プログラム三昧]
今回のPythonで作る CGI では、来客記録をとってみます。
履歴をファイルに記録する
CGIの前半では、来客記録を更新します。 来客記録は、サーバ上のファイルに記録していきます。 フォーマットは、一行に一件という簡単なものです。 Pythonには、ファイルというオブジェクトがあり、これを使うことでファイルの読み書きを行うことが出来ます。 来客があるたびにファイルの最後に"HOGE HOGE"と記録させるためには、以下のように書きます。
# Append a record of this visit f = open(record_file,"a+") try: f.write("HOGE HOGE\n") finally: f.close()
これだけでは、芸が無いので"HOGE HOGE"の代わりに来訪時刻を書かせるようにします。 これには、日付と時刻を扱う"datetime"というモジュールを使います。 "datetime"モジュールの"datetime"オブジェクトの"now()"メソッドを呼び出すと現在時刻を表す"datetime"オブジェクトを得ることができます。 このオブジェクトからお好みのフォーマットの文字列を得る"strftime()"メソッドを使って、現在時刻を表す行を作成します。
f.write(datetime.datetime.now(). strftime("%Y-%m-%d (%A) %H:%M:%S\n"))
これで、例えば、"2009-02-04 (Wednesday) 22:44:43"という一行が追加されます。
来客記録を表にする
CGIの後半では、出来上がった来客記録ファイルを使って、来客表の入ったHTML文書を作成させます。 ファイルの内容を読み出すためにも、ファイルオブジェクトを使用します。
# Make a table contents f = open(record_file,"r") try: for line in f: print "<tr><td>%s</td></tr>\n" % line finally: f.close()
この前後にHTML文書のヘッダとフッタをそろえて、CGIは、完成です。
できあがり
完成したCGIは、こうなりました。 都合により、来訪記録を書き込んだ具体的なファイル名は伏せてあります。 http://noritan.org/cgi/visitor_world.cgi に配置してありますので、よろしければ、お試しください。
#!/usr/local/bin/python # $Id: visitor_time.cgi,v 1.2 2009/02/04 13:46:27 noritan Exp $ import os import sys import datetime record_file = "XXXXXXXXXX" # Show error as a page description. sys.stderr = sys.stdout # Append a record of this visit f = open(record_file,"a+") try: f.write(datetime.datetime.now(). strftime("%Y-%m-%d (%A) %H:%M:%S\n")) finally: f.close() # Show a list of visitor record print """Content-type: text/html <html> <head> <title>VISITOR WORLD</title> </head> <body> <h1>VISITOR WORLD</h1> <table border="1" cellpadding="3"> """ # Make a table contents f = open(record_file,"r") try: for line in f: print "<tr><td>%s</td></tr>\n" % line finally: f.close() print """ </table> </body> </html> """
このCGIでは、複数の来客があった場合、同じファイルに同時にアクセスが発生します。 そのため、ファイルが壊れる危険性をもっています。 本来は、ロック機構を取り入れるべきなので、あとで考えてみます。
参考文献
図書館で借りました。
英語版は、第3版が出ています。
参考サイト
- http://python.org/
- マニュアルなどは、ここで参照しています。 Pythonは、そのバージョンによって刻々と変遷している言語なので、サーバに入っているバージョンを確認したうえでプログラムを書く必要があります。
コメント 0