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

[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

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]