Pyramidのチュートリアルをやってみる② 〜 wikiアプリケーションの設計(モデルの定義)
Pyramidのチュートリアルをやってみる① 〜インストールからアプリケーションの起動まで - [[ともっくす alloc] init]の続き.
今回は,デフォルトで生成されたアプリケーションを改造して,wikiアプリケーションを設計.モデル定義まで.
ただし,ログイン機能とかはナシ.
wikiアプリケーションの概要
概要
簡単なwikipediaのページを作ろう!っていう,それだけ.
ただし,wikiテキストの中では,reStructuredTextマークアップを使用する.
reStructuredTextって何だ???
reStructuredText は、軽量マークアップ言語のひとつ。ソースコードの状態で高い可読性を持つように設計されている。reStructuredText パーサは、テキスト処理フレームワークである Docutils のコンポーネントのひとつであり、Python で実装されている。
reStructuredText - Wikipedia
Pythonで実装されてるんですね.
ここで記法の勉強.はやわかり reStructuredText
モデル
wikiデータを保持するために,SQLiteを使い,そのためにSQLAlchemyを使う.
DBには,pagesテーブルがひとつだけ存在し,スキーマは以下の通り.
pages (name, data)
nameがwikiページのタイトルで,dataがその内容.
DBが初期化されるときに,nameが「FrontPage」,dataが「This is the front page」であるレコードが作られ,wikiホームページとして使用される.
ビュー
ビューとしては,トップページ(フロントページ),ページの追加・編集・表示の計4つあり,テンプレートには,wikiページの表示用,wikiページの追加と編集用の2つがある.
まとめ
URL,アクション,ビュー,テンプレートは以下のようにまとめられる.
URL | アクション | ビュー | テンプレート |
---|---|---|---|
/ | /FrontPageにリダイレクト | view_wiki | |
/PageName | 既存のページを表示 | view_page | view.pt |
/PageName/edit_page | 既存の内容で編集フォームを表示し,フォームが送信されたら/PageNameにリダイレクト | edit_page | edit.pt |
/add_page/PageName | テーブルにPageNameを作成して空の内容で編集フォームを表示し,フォームが送信されたら/PageNameにリダイレクト | add_page | edit.pt |
モデルを定義する
models.py
生成された models.pyからMyModelクラスを削除し,Pageクラスを作る.
これはもちろん,pagesテーブルと対応する.
models.pyのMyModelクラス:
class MyModel(Base): __tablename__ = 'models' id = Column(Integer, primary_key=True) name = Column(Text, unique=True) value = Column(Integer) def __init__(self, name, value): self.name = name self.value = value
を,以下のように変更.
class Page(Base): """ The SQLAlchemy declarative model class for a Page object. """ __tablename__ = 'pages' id = Column(Integer, primary_key=True) name = Column(Text, unique=True) data = Column(Text) def __init__(self, name, data): self.name = name self.data = data
この意味については,だいたいわかるかと.
initializedb.py
scriptsフォルダにあるinitializedb.pyは,initialize_tutorial_dbコマンドを実行したときに常に実行される.
で,モデルを変更したので,initializedb.pyを変更する必要がある.
まず,MyModelのインポートをPageのインポートに置き換え,MyModelではなくPageを作成し,そして,DBSessionにそれを加える.
initializedb.pyのfrom-import文:
from ..models import ( DBSession, MyPage, Base, )
を,以下のように変更.
from ..models import ( DBSession, Page, Base, )
そして,mainメソッド内の:
with transaction.manager: model = MyModel(name='one', value=1) DBSession.add(model)
を,以下のように変更.
with transaction.manager: model = Page('FrontPage', 'This is the front page') DBSession.add(model)
DBの初期化
モデルを変更したので,改めてDBを初期化する.
$ initialize_tutorial_db development.ini 2013-07-19 15:53:44,277 INFO [sqlalchemy.engine.base.Engine][MainThread] PRAGMA table_info("pages") 2013-07-19 15:53:44,277 INFO [sqlalchemy.engine.base.Engine][MainThread] () 2013-07-19 15:53:44,277 INFO [sqlalchemy.engine.base.Engine][MainThread] CREATE TABLE pages ( id INTEGER NOT NULL, name TEXT, data TEXT, PRIMARY KEY (id), UNIQUE (name) ) 2013-07-19 15:53:44,278 INFO [sqlalchemy.engine.base.Engine][MainThread] () 2013-07-19 15:53:44,397 INFO [sqlalchemy.engine.base.Engine][MainThread] COMMIT 2013-07-19 15:53:44,400 INFO [sqlalchemy.engine.base.Engine][MainThread] BEGIN (implicit) 2013-07-19 15:53:44,401 INFO [sqlalchemy.engine.base.Engine][MainThread] INSERT INTO pages (name, data) VALUES (?, ?) 2013-07-19 15:53:44,401 INFO [sqlalchemy.engine.base.Engine][MainThread] ('FrontPage', 'This is the front page') 2013-07-19 15:53:44,402 INFO [sqlalchemy.engine.base.Engine][MainThread] COMMIT
はい,確認しましょう.
sqlite3 tutorial.sqlite SQLite version 3.7.7 2011-06-25 16:35:41 Enter ".help" for instructions Enter SQL statements terminated with a ";"
sqlite> select * from pages; 1|FrontPage|This is the front page sqlite> .exit
いい感じです.
アプリケーションを起動
ここで一旦アプリケーションを起動してみる.
できません
$ pserve development.ini --reload ImportError: cannot import name MyModel
こんなエラーが出る.
まあ,まだモデルしか編集してないし,当然っちゃ当然.
いや,でも,本家のチュートリアルにこう書かれてるし,エラーを体験しろってことか.
今回はここまで.
次 > Pyramidのチュートリアルをやってみる③ 〜 wikiアプリケーションの設計(ビューの定義) - [[ともっくす alloc] init]
前 > Pyramidのチュートリアルをやってみる① 〜インストールからアプリケーションの起動まで - [[ともっくす alloc] init]