設計

下記は、このチュートリアルを通して行う変更を理解する助けとなる、 wiki アプリケーションの設計の簡単な概要です。

概要

wiki テキストの中で reStructuredText マークアップを使用することを 選択します。 reStructuredText から HTML への変換は、広く用いられている docutils Python モジュールによって提供されます。このモジュールを プロジェクトの setup.py ファイルの依存リストに加えます。

モデル

wiki データを保持するために SQLite データベースを使用します。また、 このデータベース中のデータにアクセスするために SQLAlchemy を使用します。

データベース内では、 pages という名前の単一のテーブルを定義します。 その要素は wiki ページを格納します。このテーブルには 2 つのカラムあります: namedata です。

/PageName のような URL は、テーブル内で対応する名前を持っている要素 を見つけようとします。

wiki にページを追加するために、新しいレコードが作成され、テキストが data に 格納されます。

ストレージが初期化される時にテキスト This is the front page を含む FrontPage という名前のページが作られ、 wiki ホームページとして使用 されます。

ビュー

ページの追加、編集、表示という通常動作を扱う3つのビューに加えて wiki フロントページのためのビューがあるでしょう。2つのテンプレートが使用 されるでしょう。一つは wiki ページの表示のため、もう一つは追加と編集の 両方のためです。

Pyramid におけるデフォルトのテンプレートシステムは ChameleonMako です。 Chameleon は ZPT の 変種で、 XML ベースのテンプレート言語です。 Mako は非 XML ベースの テンプレート言語です。1つを選ばなければならなかったので、この チュートリアルでは Chameleon を選びました。

セキュリティ

私たちは、最終的にアプリケーションにセキュリティを加えます。 このために使用するコンポーネントは下にあります。

  • USERS, ユーザ名から対応するパスワードにマッピングする辞書。
  • GROUPS, ユーザー名から所属するグループのリストにマッピングする辞書。
  • groupfinder, USERS と GROUPS を検索する authorization コールバック 。 それは新しい security.py ファイルの中で提供されます。
  • ACLは ルート resource に取り付けられています。 下記の列のそれぞれは ACE を詳述します:

    アクション Principal パーミッション
    許可 Everyone View
    許可 group:editors Edit
  • それぞれのリクエストが扱われる度にセキュリティポリシーを検査するために、 パーミッション宣言がビューに追加されます。

2つの追加のビューと1つのテンプレートが、ログインとログアウトのタスク を扱うでしょう。

まとめ

各ビューに関連した URL、アクション、テンプレートおよびパーミッションが 次のテーブルにリストされます:

URL アクション ビュー テンプレート パーミッション
/ /FrontPage に リダイレクト view_wiki    
/PageName 既存のページを 表示 [2] view_page [1] view.pt view
/PageName/edit_page

既存の内容で 編集フォームを 表示。

フォームが送信 されたら /PageName にリダイレクト

edit_page edit.pt edit
/add_page/PageName

ストレージに PageName を 作成して空の内容で 編集フォームを 表示。

フォームが送信 されたら /PageName にリダイレクト

add_page edit.pt edit
/login

ログインフォームを 表示。 Forbidden [3]

フォームが送信 されたら認証。

  • 認証が成功したら 元来たページに リダイレクト
  • 認証が失敗したら “login failed” というメッセージと ログインフォームを 表示
login login.pt  
/logout /FrontPage に リダイレクト logout    
[1]これはビュー名がない場合のページコンテキストに対するデフォルト ビューです。
[2]Pyramid は、ページ PageName がまだ存在しない場合に、 デフォルトの 404 Not Found ページを返すでしょう。
[3]ユーザが認可ポリシーによって許可されないビューを起動しようとした 場合、 pyramid.exceptions.Forbidden に到達します。