设计¶
以下是我们的wiki应用程序设计的快速概述,帮助我们了解在本教程中我们将要进行的更改。
总体¶
我们选择使用 reStructuredText wiki文本中的标记。从restructuredtext到html的转换是由广泛使用的 docutils
python模块。我们将把这个模块添加到项目的依赖项列表中 setup.py
文件。
模型¶
我们将使用一个sqlite数据库来保存我们的wiki数据,我们将使用 SQLAlchemy 访问此数据库中的数据。我们还将使用 Alembic 用于数据库迁移,包括SQLite数据库的初始化。
在数据库中,我们将定义两个表:
这个
users
将存储id
,name
,password_hash
和role
每个wiki用户。这个
pages
表,其元素将存储wiki页面。共有四列:id
,name
,data
和creator_id
.
两者之间有一对多的关系 users
和 pages
跟踪创建每个wiki页面的用户 creator_id
列上 pages
类URL /PageName
将尝试在 pages
具有相应名称的表。
若要将网页添加到wiki,将创建一个新行,并将文本存储在 data
.
一页名为 FrontPage
包含文本“This is the front page”将在初始化存储时创建,并将用作wiki主页。
维基视图¶
将有三个视图来处理添加、编辑和查看wiki页面的正常操作,另外还有一个视图用于wiki首页。将使用两个模板,一个用于查看,一个用于添加和编辑wiki页面。
从1.5版起 Pyramid 不再提供模板系统。在本教程中,我们将使用 Jinja2 . Jinja2是一种现代的、设计友好的Python模板语言,仿效Django的模板。
安全性¶
我们最终将向应用程序添加安全性。为此,我们将使用一个非常简单的基于角色的安全模型。我们将为系统中的每个用户分配一个角色类别。
basic
可以查看内容和创建新页面的经过身份验证的用户。一
basic
用户还可以编辑他们创建的页面,但不能编辑其他用户创建的页面。editor
可以创建和编辑系统中任何内容的经过身份验证的用户。
为了实现这一点,我们需要定义一个身份验证策略,该策略可以通过用户的 userid 和角色。然后我们需要定义一个页面 resource 其中包含适当的 ACL :
行动 |
校长 |
许可 |
---|---|---|
允许 |
每个人 |
看法 |
允许 |
基本组 |
创造 |
允许 |
编辑组 |
编辑 |
允许 |
<页面创建者> |
编辑 |
权限声明将添加到视图中,以在处理每个请求时断言安全策略。
在应用程序的安全方面,有两个用于处理登录和注销的附加视图,以及两个用于处理无效访问尝试和未处理URL的异常视图。
总结¶
下表列出了与每个视图关联的URL、操作、模板和权限:
URL |
行动 |
视图 |
模板 |
许可 |
---|---|---|---|---|
/ |
重定向到/FrontPage |
view_wiki |
||
页面名 |
显示现有页面 [2] |
view_page [1] |
view.jinja2 |
看法 |
/PageName/edit_page |
显示包含现有内容的编辑表单。 如果表单已提交,请重定向到/pagename |
edit_page |
edit.jinja2 |
编辑 |
/add_page/PageName |
创建页面 PageName 在存储中,显示没有内容的编辑表单。 如果表单已提交,请重定向到/pagename |
add_page |
edit.jinja2 |
创造 |
/登录 |
显示登录表单,禁止 [3] 如果表单已提交,请进行身份验证。
|
登录 |
login.jinja2 |
|
登出 |
重定向到/FrontPage |
注销 |