设计

以下是我们的wiki应用程序设计的快速概述,帮助我们了解在本教程中我们将要进行的更改。

总体

我们选择使用 reStructuredText wiki文本中的标记。从restructuredtext到html的转换是由广泛使用的 docutils python模块。我们将把这个模块添加到项目的依赖项列表中 setup.py 文件。

模型

我们将使用一个sqlite数据库来保存我们的wiki数据,我们将使用 SQLAlchemy 访问此数据库中的数据。我们还将使用 Alembic 用于数据库迁移,包括SQLite数据库的初始化。

在数据库中,我们将定义两个表:

  • 这个 users 将存储 idnamepassword_hashrole 每个wiki用户。

  • 这个 pages 表,其元素将存储wiki页面。共有四列: idnamedatacreator_id .

两者之间有一对多的关系 userspages 跟踪创建每个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

注销