WebフォームとPythonスクリプトの使用

 次に、簡単な計算を行うWebフォームを作ってみました。 Webアプリケーションでも基本中の基本というか… とりあえず、金額と換算レートを入力すると円価に変換してくれるという、 ようするに掛け算するだけなのですが…

DmDol2YenForm (DTML Method)

<dtml-var standard_html_header>

<form action="DmDol2YenResult" method="POST">
ドル価格:<input type="text" name="dol_price" maxlength="13"><br>
換算レート:<input type="text" name="exchange_rate" maxlength="4"><br>
<br>
<input type="submit" value="実行する">
</form>

<dtml-var standard_html_footer>

まずは普通のWebフォームです。2つの入力欄に数値を入力してもらいます。

DmDol2YenResult (DTML Method)

<dtml-var standard_html_header>
<h2>計算結果</h2>
<dtml-var expr="ScDol2Yen(dol_price, exchange_rate)">
<dtml-var standard_html_footer>

そのページから飛んできて、計算結果を表示するページです。 必須入力チェックやデータ型チェックは全く行っていません。 実際の計算にはPythonスクリプトScDol2Yenを使っています。 引数に渡している dol_price、exchange_rate はWebフォーム変数の値で、 特に修飾しなくてもこのように普通の変数として使えます。便利ですね!

ScDol2Yen (Python Script)

# parameter list: dol_price, exchange_rate
result = float(dol_price) * float(exchange_rate)
return result

そのスクリプトScDol2Yenです。Script(Python)はオブジェクト名がそのまま関数名となります。 パラメータは列挙するだけでよく、データ型は省略できます。 処理結果を返すには、return文を使います。 処理結果が長く、最初からそれをHTMLストリームに出力することを目的とする場合には、 特殊キーワードprintedを使うことも可能ですが、 これは別の機会に譲ります。


_(アンダー名前空間)と例外のトラップ

 上のような簡単な関数であれば、Python式としてDTMLの中に直接埋め込むこともできます。 しかし、DTMLの式の中では、Pythonの組み込み関数をそのまま使うことはできず、 _(アンダースコア)を先頭につけて呼び出します。 この_は、DTML名前空間そのものを指すオブジェクトで、 アンダー名前空間と呼ばれます。

<dtml-var standard_html_header>

<h2>計算結果</h2>
<dtml-try>
  <dtml-var expr="_.float(dol_price) * _.float(exchange_rate)">
<dtml-except ValueError>
  エラー!<br>
  数値を正しく入力して下さい。<br>
</dtml-try>
<a href="DmDol2YenForm">入力画面に戻る</a><br>
<dtml-var standard_html_footer>

上のように、文字列で入力されたWebフォーム変数の値を数値に変換するのに、 Pythonの組み込み関数floatを使っています。
 また、その型変換で例外が発生した場合、それをトラップする仕組みを加えています。 それは dtml-tryタグのブロックで、 dtml-tryの開始タグからdtml-except タグまでの間に処理を書きます。 dtml-exceptタグには通常トラップする例外の名前を指定し、 他のDTMLタグが現れるまでの間に、 その例外を捕まえたときに出力ストリームに書き出すHTMLを記述します。 例外の名前を何も指定しないと、任意の何かの例外が飛ぶとそこに行きます。 また、「例外が発生しない場合」にさせたい処理があるときには dtml-elseタグを、 例外の処理が終わったら最後に必ずさせたい処理があるときには、 dtml-finallyタグを使います。

セクションのサブメニューに戻る
(first uploaded 2002/05/26 last updated 2002/12/08)