定义域模型¶
让我们更改一下我们的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
如果尝试运行测试,也会发生这种情况。