Turbogears
Up one level初めてのTurbogears
Turbogearsのアップグレード
Turbogearsはインストール訳をしただけで放置していたのでした。たとえ手に負えないものであっても何でも流行りのものはいじってみなきゃ気が済まない私は、とりあえずインストールのその後をやってみることにしたのです。
初心者ならではの嘘や間違えを量産すればきっと誰かが助けてくれて、しかもお勉強になってしまうのではないかというのはきっと妄想で、現実はもっともっと厳しいものになるはずです。でもそうやって人生の荒海にもまれることによって、きっと僕にはミネラルたっぷりの塩味がついていくのでしょう。だからこそ人の流す涙はしょっぱいのです。
ですがツッコミ、おしかり、アドバイス、その他諸々何でも大歓迎です(あ、でもspamはいやかも…)。
ところで私はインストール厨なのでインストール訳をしたときにTurbogearsをインストールしてたんですが、これは相当に古いはず、と思ってアップデートを試みました。アップデートガイドに従って
ez_setup.py -U setuptools
easy_install -Uf http://www.turbogears.org/preview/download/index.html TurboGears
としてみると0.9a8というバージョンが入りました。
easy_installというのは好きなパッケージを自動的にインストールしてくれるステキな人らしいです。apt, yum, emergeなどのパッケージ管理システムに似てますな。おっと、Rubyにも同じようなRubyGemsとかいう人を発見しました。どこの世界にも似たような人がいるものですね~。
easy_install --help
とするといろいろ説明が出てきます。-fは勝手に探してくれと指示するオプションですか。-Uは強制アップグレードらしいですね。ふむふむ、PyPI(Python Package Index: Python Cheese Shop)で最新版を探してインストールする、と。なるほどJZIでよく見かけるちーずしょっぷというのはこのリポジトリのことだったというわけですか。「強制(force)」という言葉にややひっかかるものの、まぁ、最新版をいじるのは嫌いじゃないからいいか、ということで準備はできましたー。
Turbogearsに関する理解を深める
深まるかどうかはわからないけど、Turbogearsについてもう少し理解しないと何もできなそうです。とりあえずよく耳にする言葉であるMVCについて考えてみます。
MVCというのはModel, View, Controllerの頭文字らしく、Turbogearsではこれらの担当者が次のように決まっているようです。
- Model: SQLObject
- View: Kid
- Controller: CherryPy
MVCを分離してプログラミングしてやると何だかイイ感じに開発できるようなので、このように担当者が決まっていてそれぞれが力を合わせるらしいです。
とはいえ悲しいかな、私の頭で直感的に理解できるのはViewを担当するKidだけです。Kidはテンプレート言語。テンプレートといえばZPTです。ZPTはPloneをいじくる際によく見かけていますので「そういうものか」というふうに理解できます。しかし他の二者はちょっとわかりづらいです。
Modelを担当しているSQLObjectは、ORマッパーというものらしいです。SQLObjectについての簡単な説明を自分で訳してみたやつを読み返してみると、どうやらPython的な文法でデータベースをいじくるもののようですね。データベースにデータを保存したり、変更したり、削除したり。そういうことを担当しているようです。本来ならSQLを書いて操作するような部分を、Pythonオブジェクトを操作するような感じで書けてしまうのがどれだけすごいのか、(プログラミングなんてしたことがないので当たり前ですが)あんまり実感できないのですが、柴田さんや大谷さんがほめまくってるのを見るときっとすごいんだなと予想できます。
Controllerを担当しているCherryPyについての簡単な説明を自分で訳してみたやつを読み返してみると、やたらとメソッドという言葉を連呼していることに気づきます。私の頭の中ではメソッドというのは関数のことだというふうに記憶されています。関数というのは機能を決めるものだから、きっとControllerであるところのCherryPyも機能を決めているのでしょう。機能というのはデータというか値というかそういうものを足し算したり引き算したり掛け算したりすることだと思うので、きっとCherryPyもそんなふうにデータを料理する人なのでしょう。
ということで初心者ならではの大胆予想をすると
- Model: SQLObject
- データベース担当。バックエンドのデータベースにデータを保存したり操作してくれる人。
- View: Kid
- (x)html担当。データをWebインターフェイス(ブラウザ)に表示してくれる人。
- Controller: CherryPy
- 計算担当。ブラウザとかデータベースとかからやってきたデータを加工してくれる人。
そろそろ眠いので寝なきゃと思うんだけど、結局今日はTurbogearsのアップグレードしかしてないという…。
TurboGearsをWindowsにインストールする
Size
2.2 kB
-
File type
text/html
TurboGears: CherryPy Web Controller
Size
1.4 kB
-
File type
text/html
TurboGears: SQLObject Database Mapping Library
Size
3.2 kB
-
File type
text/html
TurboGears: Kid Template System
Size
2.9 kB
-
File type
text/html
- Category(s)
-
Turbogears
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/learning-turbogears/tbping
Turbogearsのプロジェクトを作る
何を作るか考える
さて何を作ろう。そもそも本来は作りたいものがあって、それを実現するためにTurbogearsを作るハズなんですが、毎度ながら全く本末転倒な状況になってしまっています。まぁそれは毎度のことなのでヨシとしておいて、とにかく作るものを考えないと。
とはいえ初心者が作れるものなんて限られてそうだからなぁ。データベース+Webインターフェイスでお試しアプリとかいうと、スケジューラとかアドレス帳とかがあるけど、スケジューラとかは完全に無理。カレンダー的なものなんて無理すぎ。アドレス帳は微妙だけど普段使わないからなぁ。
ということで、ジャンクお菓子評価プロジェクトにしませう(・∀・)
tg-admin hoge
Turbogearsでプロジェクトをマネージメントしてくれるのはtg-adminというツールです。ヘルプを見てみると何ができるのかが判明します。tg-admin --helpしてみると
Available commands:
i18n Manage i18n data
info Show version info
quickstart Create a new TurboGears project
shell Start a Python prompt with your database available
sql Run the SQLObject manager
toolbox Launch the TurboGears Toolbox
update Update an existing turbogears project
ということらしいです。こういうのは片っ端から試してみるのがよろしいですな。とはいえまだプロジェクトを作っていないので使えるものも使えません。ということで早速プロジェクトを作ろうじゃありませんか。
とりあえずはクイックスタートしてみればよろしいようで。
tg-admin quickstart
とすると3つのことを尋ねられました。プロジェクトの名前はJUNKSNACKとでもしておきましょう。
Enter project name: JUNKSNACK
Enter package name [junksnack]:
Do you need Identity (username/password) in this project ? [no]
パッケージ名は小文字推奨ですかな。今回はユーザ管理なんて難しいことはこれっぽっちも考えてないのでデフォルトのnoでいきます。
何かいろいろなものが生成されたようですが、これがひな形になるようですね。
プロジェクトを作ったところでtg-adminコマンドを満喫してみようではありませんか。
- i18n
- 国際化のファイルを作るためのコマンドだとは思うけれど、よくわからないので放置
- info
- 現在使っているTurbogearsに関する情報を見ることができる
- quickstart
- 今さっき使った。プロジェクトのひな形を作る
- shell
- シェルを起動する
- sql
- SQL関連のツールだけど、まだデータベース作ってないよパパン…
- toolbox
- スゲー。ブラウザ上でいろいろできちゃうツール群
- update
- 現在のプロジェクトをアップデートする。試しにやってみたら、プロジェクトを何もいじってないはずなんだけど、上書きしますか的なメッセージが出てきて怖くなったので止めた
ちなみにtoolboxを起動するにはtg-admin toolbox startとするのですが、プロジェクトのフォルダに入ってからやらないと
Note: Some functions are not available as the toolbox was not
started in a valid TurboGears project directory.
というふうに怒られてしまいます。というか怒られてしまいました(´ω`)
まぁ、とにかく難しそうだけど楽しそうです。そろそろおねむの時間ですが、今日はプロジェクトを作成しただけでした。このプロジェクト、果たしていつになったら完成するんでしょうか…。
- Category(s)
-
Turbogears
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/create-project/tbping
TurboGears関連記事
Turbogearsのプロジェクトを起動する
今日も元気に(ホントは眠いけど…)Turbogears!と思ってフォルダを開いてみたら、いつの間にか「locales」というフォルダが増えていました。おそらく前回tg-admin i18nを実行したためだと思います(すぐCtr+Cしたけど…)。
まぁそれはどうでもよいとして、前回まででとりあえずプロジェクトのひな形ができあがったわけで、この次は何をしたらいいのでしょうか。よくわからないのでネット上を徘徊してみると、start-PROJECT.pyスクリプトを実行すれば(特に何もいじらずとも)アプリケーションが起動するみたいです。ということで
python start-junksnack.py
としてみました。するとlocalhost:8080で画面が確認できました。しかもご丁寧にもこの後の開発手順が書いてある(・∀・)
1. Edit your project's model.py to create SQLObjects representing the data you're working with
2. Edit your dev.cfg file to point to the database you'll be using
3. Run "tg-admin sql create" to create the tables in the database
4. Edit controllers.py to add the functionality to your webapp
5. Change the master.kid template to have the headers and footers for your application.
6. Change welcome.kid (this template) or create a new one to display your data
7. Repeat steps 4-6 until done.
8. Profit!
さっそく次へ進みたいと思います。というのはウソで、ちょっと足を止めてstart-junksnack.pyを見てみます。だっていきなり手順1がちょっと難しそうなんだもん。
start-junksnack.pyの冒頭部はいろんなモジュールのインポートです。
#!C:\Python24\python.exe
import pkg_resources
pkg_resources.require("TurboGears")
import turbogears
import cherrypy
cherrypy.lowercase_api = True
from os.path import *
import sys
よくわからなかったのがpkg_resourcesとcherrypy.lowercase_apiですが、pkg_resourcesというのはegg関係の人らしく、Turbogearsがインストールしてないとダメだよということのようです。まぁ、見た感じそのままですね…。
またcherrypy.lowercase_apiは、CherryPyのサイトに何か書いてありました。CherryPyのAPIはCamelCaseで書かれていたのですが、それをlowercase_with_underscoresで書くようになった、と。しかも何かちょっとだけ起動が速くなるようですね(・∀・)
There's a new "cherrypy.lowercase_api" flag, so that users can say "I'm using the new lowercase API" and get a (small) speed boost from it.
start-junksnack.pyの残りの部分は以下の通り:
# first look on the command line for a desired config file,
# if it's not on the command line, then
# look for setup.py in this directory. If it's not there, this script is
# probably installed
if len(sys.argv) > 1:
turbogears.update_config(configfile=sys.argv[1],
modulename="junksnack.config")
elif exists(join(dirname(__file__), "setup.py")):
turbogears.update_config(configfile="dev.cfg",
modulename="junksnack.config")
else:
turbogears.update_config(configfile="prod.cfg",
modulename="junksnack.config")
from junksnack.controllers import Root
turbogears.start_server(Root())
なるほど、ほんとは設定ファイルを指定できるわけですか。
最初にsys.argvを見て、設定ファイルが引数として指定されていればそれを使うということですね。で、設定ファイルが指定されていないときは、setup.pyがあればdev.cfgを、そうでなければprod.cfgを使うわけですか。名前からすると、dev.cfgは開発用の設定ファイル、prod.cfgは本番用の設定ファイルという認識でよいのですかな…?
そのあとのcontrollersとかstart_serverとかはsite-packagesの中のTurbogears-VERSION.eggフォルダの中のファイルの中にあったけれど、難しそうだったので深追いするのは止めました(*´Д`)頭がこんがらがった~。あー、ホントに頭悪いなー。困った困った。
あー、朝だ。1.5hほど寝ておこう。おやすみなさぃ。
- Category(s)
-
Turbogears
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/start-project/tbping
TurboGears関連記事
Turbogearsプロジェクトのモデルを作る
前回まででとりあえずプロジェクトは起動できたのですが、ただ単にひな形を起動したというだけでここまでなら猿でもできるところです。ここから先がいよいよプロジェクトを作っていく段階に入りますが、ということはいよいよ私の脳みそもついていけなくなってくるわけです…。しかもこういうときに限って、プレッシャーがかかるトラックバックとかが打ち込まれたりしてしまうのです…orz。
モデルの担当者はSQLObjectですが、SQLObjectにデータをいじってもらうためにはどんなデータベースにするかを最初に決めておかなければならないでしょう。つまりまずはSQLObjectに「これこれこういう感じで、カラムはこうで、データの型はこうで…」といったようなことを教えてあげる必要があるに違いありません(ネットを徘徊してみた結果からの「予想」でしかありませんが)。
しかもそれ以前にデータベースの用意をしておく必要があるじゃないですか。前途多難であります。ということでやらなければならないのは…
- データベースのセットアップ
- pythonからデータベースに接続するためのモジュールのセットアップ
- データベース設定ファイル(dev.cfg)の編集
- モデルの編集(model.py)とデータベースの生成
という感じになりましょうか。
1.データベースのセットアップ
SQLObjectがいじることのできるデータベースはいくつかあるようですが、とりあえず有名どころのPostgreSQL、MySQL、SQLiteなんかはフツーに使えるようです。
実は私は今までMySQLしか使った(というか「触った」)ことがないのですが、SQLiteが軽くていいらしいので今回はSQLiteを使おうと思います。サーバ・クライアント型ではなく、データベースもファイル単位で扱うということで、何だかお手軽感がTurbogearsにぴったりな気がします。
とりあえずhttp://www.sqlite.org/download.htmlからsqlite-3_3_6.zipおよびsqlitedll-3_3_6.zipをダウンロードしてインストールしてみることにします。とはいえインストーラがついているわけではなく、アーカイブを解凍するとexeファイルが出てくるので特に困ることもないとは思いますが…。
- 「C:\sqlite」というフォルダを作る
- sqlite-3_3_6.zipおよびsqlitedll-3_3_6.zipを解凍して出てきたものたち(sqlite.exe, sqlite3.dll, sqlite3.def)をそのフォルダに放り込む
- パスを通す(マイコンピュータを右クリック→詳細設定タブをクリック→環境変数ボタンをクリック→システム環境設定の「Path」というやつを選んで編集ボタンをクリック→いろいろ書いてある一番最後に「C:\sqlite;」を追加する)
という感じにしてやりました。
一応確認のためいくつかコマンドなど試してみました。
#hogeというデータベースを生成してデータベースに入る
sqlite3 hoge
#hogeというテーブルをカラムの型を指定して生成
sqlite> create table hoge(id integer,
name varchar(20),
primary key (id)
);
#hogeテーブルにデータを挿入
sqlite> insert into hoge(name) values('fuga');
sqlite> insert into hoge(name) values('fugu');
#hogeテーブルに格納されているデータを表示
sqlite> select * from hoge;
1|fuga
2|fugu
#カラムの型を指定せずにhageというテーブルを生成
sqlite> create table hage(id integer primary key, name);
#データベース内にあるテーブルを表示
sqlite> .table
hoge hage
#hogeテーブルを削除
sqlite> drop table hoge;
#ちゃんと無くなってるか確認
sqlite> .table
hage
#データベースから出る
sqlite> .exit
た、たのしい…。
sqlite3 hogeで勝手にデータベース(hogeというファイル)が生成されるのがカッコイイです。データの型を指定しなくてもテーブルが作れてしまう(11行目)とかいうところにPython風味を感じたりもします。
2.データベース接続モジュールのセットアップ
さてさて次はpythonからデータベースに接続するためのモジュールをインストールしないといけません。今回はsqliteを使うので、pysqliteというやつをインストールします
MySQLを使う場合はmysql-python、Postgresqlを使う場合はpsycopg2などをインストールすればいいのでしょうか。いずれもeasy_installでインストールできるようですが、WindowsバイナリのPythonを使っている私の環境ではエラーが出ました。
pysqliteはeasy_installのリポジトリに含まれているので
easy_install pysqlite
で簡単にインストールできます。
pysqliteのサイトにある例を参考にして少し使ってみることにします。
以下のような内容のhoge.pyを作成します。
from pysqlite2 import dbapi2 as sqlite
con = sqlite.connect("hoge")
con.execute("create table hage(id integer primary key, name)")
これを実行すればhogeデータベースにhageテーブルが作成されるはずです。
python hoge.py
sqlite3 hoge
sqlite> .table
hage
た、たのしい…。どうでもいいことでも思い通りに動くと楽しいですね(・∀・)
3.Turbogearsプロジェクトのデータベース設定
さてさてpythonからsqliteを使えるようにセットアップできたので、次はTurbogearsのプロジェクトからsqliteを使うように設定ファイル(dev.cfg)を編集します。dev.cfgには最初からサンプルが記載されているので、こいつをちょこちょこっといじくってやればいいですね。
デフォルトではデータベースの設定は
# If you have sqlite, here's a simple default to get you started
# in development
sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"
と書いてありますが、私は今Windows上で作業しているのでこれをコメントアウトし、
# for Windows users, sqlite URIs look like:
# sqlobject.dburi="sqlite:///drive_letter:/path/to/file"
にならって、
sqlobject.dburi="sqlite:///C:/Documents and Settings/nyusuke/My Documents/Turbogears/JUNKSNACK/devdata.sqlite"
としてやりました(データベースファイルは後でtg-adminコマンドによって自動生成されるので今は存在してなくてもいい)。
4.モデルの編集とデータベースの生成
さてさて次はテーブルを定義してやります。というかその前にプロジェクトの中身をもう少し詰めないといけないですね…。プロジェクトにはどんなデータベースが必要なのかなぁ。
今回のプロジェクトはJUNKSNACKという名前で、ジャンキーなスナック菓子の評価を表示するプロジェクトです。もちろん追加や削除、編集もできるものとします。データとしては、お菓子の名前は絶対必要です。また評価としてはコメントによる評価もいいですが、これ以外にも数字によるランク(5段階の評価)も付けることにしましょう。
ということでデータベースには
- お菓子の名前(文字列)
- 5段階評価(整数)
- 一言コメント(文字列)
を保存しておくことにしましょう。
このテーブルをクラスとして表現してやります(=モデル)。
class snack(SQLObject):
name = StringCol(length=64)
eval = IntCol()
comment = StringCol()
カラムの型はいろいろ使えるようです。詳しくはSQLObject本家のドキュメントに書いてありました。日本語訳はPyJUGのSQLObjectドキュメントにあります。
以上をmodel.pyに追記して完成ヾ(゜∀゜)/
これであとはtg-admin sql createとすればテーブルが生成される…ハズ…。
ポチッとな。
…
……
………ぅぅううぉぉぉおおおおお!!!
データベースファイル発見。
中身を確認してみます。
sqlite3 devdata.sqlite
sqlite> .table
snack
#snackテーブルの構造を確認
sqlite> .schema snack
CREATE TABLE snack (
id INTEGER PRIMARY KEY,
name VARCHAR(64),
eval INT,
comment TEXT
);
できてますねヾ(゜∀゜)/
疲れたので今日はここまで~。
- Category(s)
-
Turbogears
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/edit-projects-model/tbping
CatWalkでデータベースにレコードを追加
CatWalkはカッコイイ
データベースをいじろうとして試行錯誤している間に間違えに気づきました。前回データベースを生成するときに、nameカラムおよびcommentカラムの型に「StringCol」を指定していたのですが、これだと日本語が入力できないのですね(asciiのみ)。日本語入力を可能にするためには「UnicodeCol」である必要があります。ですので、
tg-admin sql drop
で現在のsnackテーブルを削除し、
model.pyの記述を以下のように変更しました。
class snack(SQLObject):
name = UnicodeCol()
eval = IntCol()
comment = UnicodeCol()
そして再びtg-admin sql createを実行すればOKです。
前回テーブルの構造を確認するのに、わざわざsqlite3コマンドを使っていたのですが、tg-adminコマンドに同様の機能(tg-admin sql sql)がありました。便利ですね~。
tg-admin sql sql
Using database URI sqlobject.dburi="sqlite:///C:/Documents and Settings/nyusuke/My Documents/Turbogears/JUNKSNACK/devdata.sqlite"
CREATE TABLE snack (
id INTEGER PRIMARY KEY,
name TEXT,
eval INT,
comment TEXT
);
さて、テーブルは生成できましたがまだ中身がありませんので、いくつかレコードを追加してみようと思います。sqlite3の方から追加してもいいんだとは思いますが、ここではCatWalkという、Turbogearsツールボックスに組み込まれている機能を使ってみたいと思います。
tg-admin toolboxコマンドでツールボックスを立ち上げたら、ブラウザから「localhost:8080」にアクセスします。右上にCatWalkへのリンクがありますのでクリックしましょう。
*CatWalkにアクセスする方法はもう一つあります。model.pyにマウントするやり方ですが、詳しくはこちらを参考にどうぞ。
味気ない画面ですが、左側にsnackテーブルが見えます(複数テーブルがある場合はここにずらっと並びます)。
これをクリックするとテーブルのサマリを見ることができます。
よく見てみるとカラムの並び順が期待したとおりにはなっていません。Comment, Name, Evalという順番になってしまっています(上記画面ではEvalカラムが切れてしまって見えていませんが、実際にはNameカラムの右側に表示されています)。まずはこのカラムの順番をName, Eval, Commentという順番に変更してみます。
カラムの順番を変更するには、Manage Cokumnsというリンクをクリックします(上記画像のテーブルアイコンの部分をクリックします)。
すると以下のような編集画面に行くことができます。
ここで各カラムのチェックの左側にマウスをホバーさせれば、ドラッグして順番を移動させることができます。順番を移動できたら「Save」ボタンを押します。
順番が入れ替わりました(・∀・)
それではいくつかレコードを追加してみたいと思います。「Add snack +」という青色のボタンをクリックするとレコード追加画面に行くことができます。
入力は直感的にわかると思います。invalidな値を入力しようとすると、「Save」ボタンが押せなかったりします。例えばnameカラムをStringColとして生成した場合は日本語でレコードを追加しようと思っても「Save」ボタンを押すことができません。また例えばevalカラムはIntColとして生成されていますので、全角の数字や、文字を入力しようと思ってもダメです。
「Save」ボタンを押せばレコードが追加されます。
テーブルのサマリを見てみましょう。
確かに追加されてますね!レコード上にマウスを持っていけば編集や削除のアイコンが表示されます。カッコイイなぁ。
CatWalkを満喫したところで今日は終了。おやすみなさ~い(・∀・)ノ
- Category(s)
-
Turbogears
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/manage-database-with-catwalk/tbping