Python CGI でqueryを受け取る [プログラム三昧]
前回のPython CGIでは、決まったHTML文書を表示するだけでした。 今回は、QUERYを介してメッセージを表示させます。
QUERYって何だ?
HTML文書を要求する時、文書名の後にパラメータを付けることがあります。 例えば、こんな感じ。
http://noritan.org/cgi/echo_world.cgi?message=GOOD%20MORNING&time=06:00
この疑問符から後の部分をQUERYと呼び、CGIがその構文を解析してパラメータと値を適切に処理します。 「構文解析、めんどうジャン」と、思ったあなた。 そんな方のために、Pythonは、cgiという名のモジュールを用意してくれています。
今日のCGI - ECHO WORLD
今日のCGIは、QUERYから"message"というパラメータを見つけ出して、HTML文書として表示するプログラムです。
#!/usr/local/bin/python # $Id: echo_world.cgi,v 1.2 2009/02/02 12:52:37 noritan Exp $ import sys import os import cgi # Show error as a page description. sys.stderr = sys.stdout # 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 = {} # Get and escape a MESSAGE message_key = 'message' if message_key in query: message = cgi.escape(query[message_key][0]) else: message = "ECHO WORLD" # Show MESSAGE print """Content-type: text/html <html> <head> <title>%(message)s</title> </head> <body> <h1>%(message)s</h1> </body> </html> """ % {message_key:message}
与えられたQUERYは、環境変数"QUERY_STRING"で引き渡されます。 環境変数連想リスト"os.environ"からQUERY全体を引き出します。 そして、"cgi.parse_qs"で構文解析を行い連想リスト"query"を作成します。 このように、難しい処理は、すべて"cgi"モジュールがやってくれます。
次は、"query"連想リストからパラーメタ"message"を抜き出します。 ここでも"cgi"のメソッドである"cgi.escape"が使用されています。 このメソッドは、HTML文書で使われる < などの特殊記号を < のようにエスケープしてくれるメソッドです。 もし、この処理が無かった場合には、「クロス・サイト・スクリプティング」と呼ばれる怪しい行為に利用されるかもしれません。 たとえば、
http://noritan.org/cgi/echo_world.cgi?message=%3Cscript%3Ealert(%27hello%27)%3C/script%3E
などと、意図しないスクリプトを実行させられてしまう可能性があるのです。 そのため、「エスケープの必要性」があるという事に注意を払いましょう。 この処理もモジュールがやってくれるので、ラクチンです。
HTML文書の構成は、前回と同じです。 単純にタイトルと第一レベルヘッダを表示しています。
また、ここに配置しておきましたのでお試しください。
http://noritan.org/cgi/echo_world.cgi
コメント 0