So-net無料ブログ作成

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文書で使われる < などの特殊記号を &lt; のようにエスケープしてくれるメソッドです。 もし、この処理が無かった場合には、「クロス・サイト・スクリプティング」と呼ばれる怪しい行為に利用されるかもしれません。 たとえば、

http://noritan.org/cgi/echo_world.cgi?message=%3Cscript%3Ealert(%27hello%27)%3C/script%3E

などと、意図しないスクリプトを実行させられてしまう可能性があるのです。 そのため、「エスケープの必要性」があるという事に注意を払いましょう。 この処理もモジュールがやってくれるので、ラクチンです。

HTML文書の構成は、前回と同じです。 単純にタイトルと第一レベルヘッダを表示しています。

また、ここに配置しておきましたのでお試しください。

http://noritan.org/cgi/echo_world.cgi

被参照サイト


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

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

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

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