跳转到主要内容

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.Modelgrokcore.component.Context 继承,所以上面提到的与外部模型相关的问题在这里不会出现。

请注意,Traject 模型在 ZODB 意义上不是持久的。如果您需要持久的 Traject 模型,可以混入 grok.Modelpersistent.Persistent

技巧

  • 如果模型找不到,在工厂中返回 None。然后系统将回退到正常遍历来查找视图。过度消费任何参数将破坏视图遍历。

  • 使用 megrok.traject.locate 来定位对象,然后再请求其 URL 或对其执行 checkPermission。如果对象已通过 megrok.traject 路由,则这不是必需的。这是一个简单的导入别名 traject.locate

  • 对于 factoryarguments,除了正常方法(被解释为函数)之外,您还可以使用 @classmethod 装饰器将它们转换为类方法。现在它们将 cls 作为第一个参数,即它们定义的类。如果这些函数的实现依赖于类的信息(例如 model 的值),这将很有用,这反过来又可用于实现更声明的 traject 基类。

有关更多信息,请参阅 traject 文档。

CHANGES.txt

1.0 (2010-08-08)

  • 现在也可以为 factoryarguments 使用 @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 (12.7 kB 查看哈希值)

上传时间 源代码

由以下支持