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 | 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. |