TurboGearsで何か作る
と、いうわけでTurboGearsが動くようになったので、公式サイトのチュートリアルを参考にしながらToDoアプリを作ってみます。
まずは、モデルを作る。
SQLObjectはActiveRecordパターンということで、クラス名とテーブル名、クラスのプロパティとテーブルのカラムが対応するかたちになる。
なので、テーブル名クラスの中に、カラムを設定していく。
model.py
class TodoList(SQLObject): title = UnicodeCol(default='', length=255) content = UnicodeCol(default='') created = DateTimeCol(default=datetime.now) #作成日時 deadline = DateTimeCol(default=None) #〆切り finished = DateTimeCol(default=None) #終了日時 user = ForeignKey("User") def isfinish(self): return self.finished is not None isdone = isfinish() class User(SQLObject) ・・・ todolist = MultipleJoin("TodoList", joinColumn="user_id")
ユーザーとTodoは、1対多になるので、TodoクラスにUserクラスへの外部キーを設定する。
UserクラスにTodoクラスへの参照を設定するには、MultipleJoin()を使えばいいらしい。
モデルを設定したら、SQLを発行して設定した内容のテーブルを作る。
tg-admin sql create
と、打ったらモデルに設定した内容でデータベースにテーブルが作られた!すげー
ではではコントローラを書いてく。
TurboGearsでは、CherryPyというコントローラを使っていて、URLとクラス・メソッドを結びつけてくれるそうです。
controller.py
class Root(controllers.RootController): todo = Todo()
としてやると、「http://localhost:8080/todo/」にアクセスすると、Todoクラスのindex()を実行してくれる。
class Todo(controllers.RootController): @identity.require(identity.not_anonymous()) @expose(template="tgtest.templates.todo") def index(self): all_todolist = identity.current.user.todolist todolist = [dict(title=t.title, deadline=t.deadline, content=t.content, isdone=t.isdone) for t in all_todolist] return dict(todolist=todolist)
「@identity.require(identity.not_anonymous())」は、ログインしているかをチェック、
「@expose(template="tgtest.templates.todo")」は、戻り値を渡して表示するテンプレートの指定です。
モデルで、テーブルの関係を設定しているので、「identity.current.user.todolist」で今ログインしているユーザーのToDo一覧を取ってこれます。
最後にテンプレートを作る。
todo.kid
<!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" xmlns:py="http://purl.org/kid/ns#" py:extends="'master.kid'"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/> <title>ToDo</title> </head> <body> <div id="main_content"> <!-- ToDoを表示 --> <div align="center"> <ul> <li py:for="task in tasks"> <span py:content="task['title']"></span> <span py:content="task['deadline']"></span> <span py:content="task['content']"></span> </li> </ul> </div> </div> </body> </html>
ToDoテーブルにデータを適当に放りこんで、「http://localhost:8080/todo」にアクセスしてログインすると・・・
無事放り込んだToDoデータの一覧が表示されたー
あー疲れた。細かく追加した機能はまた後で書く。
と、いうかPHPと比べると、TurboGearsについて書いてる日本語サイトのひっかかる量が少なすぎ。。。
やっぱり日本ではTurboGearsはメジャーじゃないのか、TurboGearsを使っている人があまりブログを書かないのかどっちなんだー
でも、ファイルの更新検知してWebサーバーを自動リブートとか、URLとメソッドのマッピングとか、expose()の仕組みとかでCherryPyのソース読んでたらめちゃめちゃ勉強になりました。
こんな自分でも読めるってことは、やっぱりPythonはきれいに書けるというのは本当かもしれないです。
とか書いてたらだんだん好きになってきたので、もっとTurboGears調べて書いてみようっと。