IronPython for ASP.NET

ASP.NETIronPythonを利用できるようになる拡張が公開されていたので、さっそく入れてみた。

IronPython for ASP.NET CTP

VS2005のプロジェクトテンプレートとしてインストールされるので、

  1. ファイル->新規作成->Webサイトを選択して、言語をIronPythonに変更する。
  2. ASP.NET Web Siteを選択して、プロジェクトを作成。

で、作成されるテンプレートを見てみると

[App_Script]
[bin]
Default.aspx
Default.aspx.py
Global.py
Web.config

まぁ、コードビハインドファイルの拡張子がpyに変わったのと、App_CodeフォルダがApp_Scriptに変わってぐらいか?

中身を見る

で、中を見ていくと
Web.configファイルのHttpハンドラにIronPython用のものが追加されている。

<httpHandlers>
  <add path="Web_*.py" verb="*" type="Microsoft.Web.IronPython.SimpleHandler"/>
  <add path="*.py" verb="*" type="System.Web.HttpForbiddenHandler" validate="true" />
</httpHandlers>

HttpForbiddenHandlerはスクリプトファイルへの直接アクセスを防ぐものとしてわかるけど、上のSimpleHandlerは、なにすんねやろ?実行時にWeb_*.pyというファイルが作られるのかな?

Default.aspxを見ると、Pageディレクティブがえらいすっきりしてる。

<%@ Page Language="IronPython" CodeFile="Default.aspx.py" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>

さすがに動的型付けの言語なので、Inherits属性は指定できないか

で、それのコードビハインドファイルであるDefault.aspx.pyは

import System
from System.Data import *
from System.Web import *
from System.Web.UI import *
from clr import *

def Page_Load():
    pass

import宣言とLoadのイベントハンドラのみ。
Loadイベントの引数(object sender, EventArgs e)がないけど、いらないってこと?(省略可能なだけ?)

書いてみる

とりあえず簡単な処理を書いてみる。
まず、Default.aspxにテキストボックスとボタン、ラベルを追加する。で、ボタンをダブルクリックして、イベントハンドラを追加と思ったら追加できない!未サポートか?仕方がないので、手動で追加。

<form id="form1" runat="server">
  <div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    <br />
    <asp:Label ID="Label1" runat="server"></asp:Label>
  </div>
</form>

Defalt.aspx.pyにイベントハンドラを追加する。

def Button1_Click():
	Label1.Text = TextBox1.Text

テキストボックスの値をラベルに表示するだけ。
これを仮想Webサーバーで起動して、動かしてみる...

おお!普通に動いた。
コンパイルの必要がないので、かなり高速に動作しているように見える。ASP.NETの場合、頻繁にリコンパイルして画面を見ながら開発する必要があるので、コードを修正してもリコンパイルしなくてもいいというのは、結構ばかにできないぐらい生産性に差が出るような気がする。VS2005のコンパイルがくそ遅いから。

ビジネスロジックをC#で実装して、プレゼンテーション層はIronPythonで実装するというのも結構いいかも。普通に連携できるしね。あとは、Spring.NETがIronPythonで作ったWebPageへのInjectionに対応してくれたら実用できるかもしれん。