定义域模型

让我们更改一下我们的stock cookiecutter生成的应用程序。我们将定义两个 resource 构造器,一个表示wiki页面,另一个表示wiki作为wiki页面名称到页面对象的映射。我们会在里面做这个 models.py 文件。

因为我们正在使用 ZODB 代表我们 resource tree ,每个资源构造函数表示 domain model 对象。我们将这些构造函数称为“模型构造函数”。都是我们的 PageWiki 构造函数将是类对象。“wiki”类的单个实例将用作“page”对象的容器,而“page”对象将是“page”类的实例。

参见

在本教程的其余部分中,我们将介绍许多概念。另见章节 资源 有关资源和章节的完整描述 遍历 有关遍历如何在Pyramid中工作的技术细节。

删除数据库

在下一步中,我们将删除 MyModel 我们的python模型类 models 包。因为这个类是在持久存储中引用的(在磁盘上表示为一个名为 Data.fs )下一次我们想在浏览器中访问应用程序时,会发生一些奇怪的事情。

移除 Data.fstutorial 继续之前的目录。只要您不关心数据库的内容,就可以这样做。数据库本身将根据需要重新创建。

编辑 models

备注

包名没有什么特别的 models . 一个项目在其代码库中的任意命名的文件和目录中可能有许多模型。实现模型的文件通常 model 或者它们可能位于名为的应用程序包的python子包中。 models 但这只是惯例。

正常开放 tutorial/models/__init__.py 文件并将其编辑为如下所示:

 1from persistent import Persistent
 2from persistent.mapping import PersistentMapping
 3
 4
 5class Wiki(PersistentMapping):
 6    __name__ = None
 7    __parent__ = None
 8
 9class Page(Persistent):
10    def __init__(self, data):
11        self.data = data
12
13def appmaker(zodb_root):
14    if 'app_root' not in zodb_root:
15        app_root = Wiki()
16        frontpage = Page('This is the front page')
17        app_root['FrontPage'] = frontpage
18        frontpage.__name__ = 'FrontPage'
19        frontpage.__parent__ = app_root
20        zodb_root['app_root'] = app_root
21    return zodb_root['app_root']

强调线表示变化,如下所述。

移除 MyModel 从生成的 models/__init__.py 文件。这个 MyModel 类只是一个示例,我们不会使用它。

接下来,我们在顶部为 persistent.Persistent 类。我们用这个换新的 Page 马上上课。

1from persistent import Persistent
2from persistent.mapping import PersistentMapping

然后我们添加一个 Wiki 类。

5class Wiki(PersistentMapping):
6    __name__ = None
7    __parent__ = None

我们希望它继承自 persistent.mapping.PersistentMapping 类,因为它提供映射行为。它还确保我们的 Wiki 页面在我们的ZODB数据库中存储为“一流”持久对象。

我们的 Wiki 类应将两个属性设置为 None 课堂范围: __parent____name__ . 如果模型有 __parent__ 属性 None 在基于遍历的 Pyramid 应用程序,这意味着它是 root 模型。这个 __name__ 根模型的 None .

现在我们添加一个 Page 类。

 9class Page(Persistent):
10    def __init__(self, data):
11        self.data = data

此类应继承自 persistent.Persistent 类。我们会给它一个 __init__ 方法,它接受一个名为 data . 此参数将包含 reStructuredText 表示wiki页面内容的正文。

注意 Page 对象没有初始值 __name____parent__ 属性。遍历图中的所有对象都必须具有 __name__ 和A __parent__ 属性。我们在这里没有具体说明。相反,两者都 __name____parent__ 将由一个 view 函数时 Page 添加到我们的 Wiki 映射。我们将在下一章中创建这个函数。

最后一步,编辑 appmaker 功能。

13def appmaker(zodb_root):
14    if 'app_root' not in zodb_root:
15        app_root = Wiki()
16        frontpage = Page('This is the front page')
17        app_root['FrontPage'] = frontpage
18        frontpage.__name__ = 'FrontPage'
19        frontpage.__parent__ = app_root
20        zodb_root['app_root'] = app_root
21    return zodb_root['app_root']

这个 root resource 我们的应用程序是一个wiki实例。

我们还将在wiki的 appmaker . 这将提供 traversalresource tree 当它试图将URL解析为资源时,要进行处理。

在浏览器中查看应用程序

我们不能。此时,我们的系统处于“不可运行”状态,我们需要在下一章中更改与视图相关的文件,以便成功启动应用程序。如果您试图启动应用程序(请参见 启动应用程序 ,您将在控制台上得到一个以这个异常结束的python回溯:

ImportError: cannot import name MyModel

如果尝试运行测试,也会发生这种情况。