定义域模型¶
让我们更改一下我们的stock cookiecutter生成的应用程序。我们将定义两个 resource 构造器,一个表示wiki页面,另一个表示wiki作为wiki页面名称到页面对象的映射。我们会在里面做这个 models.py 文件。
因为我们正在使用 ZODB 代表我们 resource tree ,每个资源构造函数表示 domain model 对象。我们将这些构造函数称为“模型构造函数”。都是我们的 Page 和 Wiki 构造函数将是类对象。“wiki”类的单个实例将用作“page”对象的容器,而“page”对象将是“page”类的实例。
删除数据库¶
在下一步中,我们将删除 MyModel 我们的python模型类 models 包。因为这个类是在持久存储中引用的(在磁盘上表示为一个名为 Data.fs )下一次我们想在浏览器中访问应用程序时,会发生一些奇怪的事情。
移除 Data.fs 从 tutorial 继续之前的目录。只要您不关心数据库的内容,就可以这样做。数据库本身将根据需要重新创建。
编辑 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 . 这将提供 traversal 一 resource tree 当它试图将URL解析为资源时,要进行处理。
在浏览器中查看应用程序¶
我们不能。此时,我们的系统处于“不可运行”状态,我们需要在下一章中更改与视图相关的文件,以便成功启动应用程序。如果您试图启动应用程序(请参见 启动应用程序 ,您将在控制台上得到一个以这个异常结束的python回溯:
ImportError: cannot import name MyModel
如果尝试运行测试,也会发生这种情况。