Traject集成于Grok应用程序
项目描述
megrok.traject
megrok.traject 是一个库,它将 traject 路由框架与 Grok 网络框架集成。
通过在您的Grok项目的 setup.py(在 install_requires 中)中添加 megrok.traject 并重新运行buildout来包含 megrok.traject。
外部trajects
如果直接控制模型,则外部trajects最有用。例如,如果模型定义在外部包中,则可能发生这种情况。
使用 megrok.traject,您可以在Grok中声明trajects,如下所示
from megrok import traject class SomeTraject(traject.Traject): grok.context(App) pattern = 'departments/:department_id' model = Department def factory(department_id): return get_department(department_id) def arguments(department): return dict(department_id=department.id)
这注册了 factory 和反向 arguments 函数,用于模式 departments/:department_id、根 App 和类 Department。这取代了traject本身中的 register* 函数。
App 是任何grok模型。现在,此模型自动允许对相关模式进行遍历;系统注册了一个自定义遍历器来完成此操作。
您可以将 部门 视图注册为常规操作。
上下文问题
如果您能这样做,请将 traject 提供的模型从 grokcore.component.Context(或其别名 grok.Context,或其别名 traject.Context)进行子类化。通过这样做,您可以避免下面描述的问题。
有时您不能从 grokcore.component.Context 子类化您的模型。毕竟,megrok.traject 被设计成允许暴露外部模型。
当您使用 megrok.traject 与外部模型一起使用时,您可能会遇到以下两个与模型相关的问题
ZTK 假设对象的默认视图是 index.html,而不是 index。当您从 grokcore.component.Context 子类化模型时,才会使用 index 默认视图设置。您仍然可以通过向项目中的 configure.zcml 添加以下指令来使 index 成为模型默认视图
<browser:defaultView for="SomeForeignModel" name="index" />
您也可以为此创建一个所有模型共享的通用基类,或者一个所有模型都提供的通用接口。
视图、适配器等不会自动与同一模块中的模型关联。您需要显式在模块或类级别使用 grok.context() 来关联您的组件。例如
class SomeForeignModel(object): ... class MyView(grok.View): grok.context(SomeForeignModel)
Traject 模型
如果您可以控制模型定义,traject 允许使用更紧凑的表示法,可以直接定义基于 traject 的模型
import traject class Department(traject.Model): traject.context(App) traject.pattern('departments/:department_id') def factory(department_id): return get_department(department_id) def arguments(self): return dict(department_id=self.id)
traject.Model 从 grokcore.component.Context 继承,所以上面提到的与外部模型相关的问题在这里不会出现。
请注意,Traject 模型在 ZODB 意义上不是持久的。如果您需要持久的 Traject 模型,可以混入 grok.Model 或 persistent.Persistent。
技巧
如果模型找不到,在工厂中返回 None。然后系统将回退到正常遍历来查找视图。过度消费任何参数将破坏视图遍历。
使用 megrok.traject.locate 来定位对象,然后再请求其 URL 或对其执行 checkPermission。如果对象已通过 megrok.traject 路由,则这不是必需的。这是一个简单的导入别名 traject.locate。
对于 factory 和 arguments,除了正常方法(被解释为函数)之外,您还可以使用 @classmethod 装饰器将它们转换为类方法。现在它们将 cls 作为第一个参数,即它们定义的类。如果这些函数的实现依赖于类的信息(例如 model 的值),这将很有用,这反过来又可用于实现更声明的 traject 基类。
有关更多信息,请参阅 traject 文档。
CHANGES.txt
1.0 (2010-08-08)
现在也可以为 factory 和 arguments 使用 @classmethod。如果这些函数依赖于它们定义的类的信息,这很有用。
0.10.1 (2010-01-25)
在文档中添加了关于从 grokcore.component.Context 继承模型或当无法这样做时应做什么的注释。
为了方便起见,公开了 traject.Context。
修复 ReST 文档。
0.10 (2009-11-30)
支持 traject.Model,当模型受开发者控制时,这是一种更紧凑的方式来定义 traject。
0.9 (2009-11-16)
首次公开发布。
下载
项目详情
megrok.traject-1.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7a56430642f953902b21382be5241964cccc515982f726c0eef8e022c5067ee1 |
|
MD5 | 389f813b7778ef54e7f9e68beea14e2c |
|
BLAKE2b-256 | b1bcac778f6b8d6ed4f86352658f133317c64e31273b47c010985f2cb421279e |