読者です 読者をやめる 読者になる 読者になる

Blogを作る(1)プロジェクトを作る

Pylons

 Pylonsは、TurboGears, Djangoに次ぐ*1Python Webアプリケーション・フレームワークで、オーソドックスなMVCアーキテクチャと、優れたWSGIユーティリティ・ライブラリであるPasteを使用している点に特徴があります。

インストール

 インストールはCheese shop経由で行います。本稿執筆時の最新版は、0.9.4.1です。

$ easy_install Pylons

 上のコマンドを実行すると、依存しているライブラリすべてがダウンロード、インスタンスされます。
 開発版をインストールする場合は、次のコマンドを使います。

$ easy_install -U http://pylonshq.com/svn/Pylons/trunk


 また、後でデータの永続化にSQLAlchemyを利用するので、これもインストールしておきます。

$ easy_install SQLAlchemy

プロジェクトを作る

 Pylonsプロジェクトを作成するには、pasterコマンドを使います。

$ paster create --template=pylons BlogTutorial

 プロジェクト名は"BlogTutorial"としました。上のコマンドを実行すると、カレントディレクトリにBlogTutorialというディレクトリが作成され、その中にプロジェクトに必要なコード群が自動的に作られます。次のようなディレクトリ構成になります。


開発サーバを起動する

 これで、Pylonsプロジェクトを開始する準備が整いました。ここでBlogTutorialディレクトリに移動して、開発サーバを起動してみます。

$ cd BlogTutorial
$ paster serve --reload development.ini

 "paster serve"コマンドを使って開発サーバを起動します。"--reload"オプションを付けた場合、設定ファイルやソースコードを変更した場合に、自動的にサーバを再起動してくれます。


 開発サーバのデフォルトポート番号は5000です。http://locahost:5000にアクセスすると、次のような画面が表示されます。


コントローラを作る

 続いて、Blogの閲覧、投稿を受け持つコントローラを作ります。コントローラとそのテストコードも、pasterコマンドで作ることができます。

$ paster controller blog

 "blog"というのがコントローラモジュールの名前で、上のコードを実行すると、blogtutorial/controllers/blog.pyとtests/functional/test_blog.pyというコードが自動生成されます。このblog.pyにビューとモデルを関連づけるコードを記述していきます。


 標準の設定では、"/コントローラ名/アクション名/モデルのID"というURLで、各アクションを呼び出すことになるので、このことを念頭においてコントローラ名を決めるとよいでしょう。(URLからアクションへのルートマッピングを変更することもできます。)
 また、プロジェクト名と同一のコントローラ名と付けることはできません。つまりプロジェクト"Blog"に、"blog"というコントローラを作ることはできません。

コントローラとビューの第一歩

 自動生成されたコントローラのコードは次のようになっています。

from blogtutorial.lib.base import *

class BlogController(BaseController):
    def index(self):
        # Return a rendered template
        #   return render_response('/some/template.html')
        # or, Return a response object
        return Response('Hello World')


 Pylonsでは、コントローラとして、BaseControllerの派生クラスを使います。コントローラのインスタンスメソッドが、アクションに対応します。つまり、標準の設定では、"/blog/index/"というURLでは、BlogControllerインスタンスのindexメソッドが呼び出され、"/blog/show/1"というURLでは、show(self, id)というメソッドが呼び出されます。


 次にテンプレートを使ってみましょう。ひとまず、動作確認のみを行いたいので、テンプレート変数の割り当ては行わないことにします。
 上のコードを次のように変更しました。

from blogtutorial.lib.base import *

class BlogController(BaseController):
    def index(self):
    	return render_response('index.myt')


 Pylonsの標準テンプレートエンジンはMyghtyなので、拡張子はmytとしています。上のコードは、blogtutorial/templates/index.mytというテンプレートをビューとして使う、ということを意味しています。


 そのindex.mytを用意します。(とりあえず、何の変哲もないただのHTMLです。)

<h2>It works!</h2>


 この状態で、http://localhost:5000/blog/にアクセスしてみると、次のような画面が表示されます。 



 さらにtemplates/autohanderというテンプレートを使って、アプリケーション共通のレイアウトは、適用します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>My Blog</title>
</head>
<body id="myblog">
<div id="container">

<div id="header">
<h1>My Blog</h1>
</div><!-- end header -->

<div id="main">
% m.call_next()
</div><!-- end main -->

<div id="footer">
</div><!-- end footer -->
</div><!-- end container-->
</body>
</html>


 このテンプレート中程の"% m.call_next()"という部分に、各ビューのテンプレートの出力が埋め込まれることになります。



 まだスタイルシートを用意していないので見栄えはしませんが、本格的に作り始める準備は整いました。


 「Blogを作る(2)データベースの設定」につづく。

*1:と思われる。Zopeを除く。