Design(デザイン)

以下でチュートリアルの行ううえ変更を理解するのに役立つ、Wikiアプリケーションの設計の概要を簡単に説明します。

Overall(全体)

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

Models(モデル)

wikiのデータを保持するためにSQLiteをしようします。そしてデータベースのアクセスには SQLAlchemy を使用します。

データベースないテーブルを2つ定義します:

  • 「users」テーブル。「id」,「name」, 「password_hash」および、各wiki userの「role」があります。
  • 「pages」テーブル。wikiページの要素を保存します。4つのカラムがあります。「id」, 「name」, 「data」 、「creator_id」。

「pages」テーブルのカラムで 各wikiページを作成したユーザー間では、1 対多の関係が「users」と「pages」の「creator_id」にあります。

「/PageName」 のURL は、対応する名前を「pages」テーブル内からを探します

wikiにページを追加するには、新しいrow(行)が作成されてテキストが「data」に格納されます。

「This is front page」というテキストを含む「FrontPage」ページは、ストレージが初期化されたときに作成されて、wikiのホームページとして使用されます。

Wiki Views(Wikiビュー)

通常の操作である、wikiページの追加、編集するビュー。表示するビューに加えて、wikiフロントページのビューを処理する3つのビューがあります。表示用に1つ、wikiページの追加と編集の両方に2つのテンプレートが使用されます。

バージョン1.5からは、Pyramid はテンプレートシステムと一緒に出荷されなくなりました。このチュートリアルでは、 Jinja2 を使用します。Jinja2はDjangoのテンプレートに基づいて作成された、Pythonのためのモダンでデザイナーに優しいテンプレート言語です。

Security(セキュリティ)

最終的にはアプリケーションにセキュリティを追加する予定です。これを行うには非常に簡単なロールベースのセキュリティモデルを使用します。システム内の各ユーザーに1つの役割カテゴリを割り当てます。

「basic」
コンテンツを表示して新しいページを作成できる認証済みのユーザー。また「basic」ユーザーは自分が作成したページだけでなく、他のユーザーによって作成されたページも編集できます。
「editor」
システム内のコンテンツ作成および編集可能な認証済みのユーザー。

これを達成するには、 userid とロール(役割)によってユーザーを識別できる認証ポリシーを定義する必要があります。次に、適切な ACL を含むページ resource を定義する必要があります:

アクション 支配者 許可
許可 全員 ビュー
許可 basicグループ 作成
許可 editorsグループ 編集
許可 <ページの作成者> 編集

各要求が処理されるときにセキュリティポリシーをアサートするために、アクセス許可の宣言がビューに追加されます。

アプリケーションのセキュリティ側にはログインとログアウトを処理するための2つの追加のビューと、無効なアクセス試行と未処理のURLの処理に関する2つの例外ビューがあります。

Summary(サマリー)

各ビューに関連付けられているURL、アクション、テンプレート、および権限は、以下の表を見てください:

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

既存のコンテンツを含む編集フォームを表示します。

フォームでサブミットされたら、/PageNameにリダイレクトします

edit_page edit.jinja2 編集
/add_page/PageName

ストレージに「PageName」を作成してコンテンツなして編集フォームを表示します。

フォームでサブミットされたら、/PageNameにリダイレクトします

add_page edit.jinja2 作成
/login

ログインフォームの表示、禁止 [3]

フォームがサブミットされた場合は認証されます。

  • 認証が成功すると、アクセスしたページにリダイレクトされます
  • 認証が失敗すると、ログインフォームに「login failed」メッセージが表示される。
login login.jinja2  
/logout /FrontPage にリダイレクト logout    
[1]This is the default view for a Page context when there is no view name.
[2]Pyramid will return a default 404 Not Found page if the page PageName does not exist yet.
[3]pyramid.exceptions.Forbidden is reached when a user tries to invoke a view that is not authorized by the authorization policy.