【问题标题】:Using singleton classes in domain model traversal in Pyramid在 Pyramid 的域模型遍历中使用单例类
【发布时间】:2015-05-27 20:58:06
【问题描述】:

我正在开始使用 Pyramid,并且对将遍历作为路由策略感到兴奋。它看起来自然而有力。然而,我的想法使我走上了一条可疑的道路。你能推荐一个更好的模式吗?

我正在尝试实现一些 RESTful 路由。例如,我想映射以下内容:

  • GET /users -> 索引
  • GET /users/chris -> 显示
  • GET /users/new ->
  • POST /users -> 创建
  • PUT /users/chris -> 更新
  • 删除 /users/chris -> 销毁

showupdate 操作的最终上下文似乎应该是 User 的适当实例,但是 index创建?看起来 User 类本身就是一个合适的上下文,但是遍历机制,__getitem__ 方法,不能在没有一些元类魔法的类上实现。似乎有一种更清洁的方法可以做到这一点。显然我可以创建一个 UserResourceContainer ,它唯一的工作就是处理遍历,但我被使用 User 类的优雅所吸引。想法?

【问题讨论】:

  • 您打算如何实现 /users 资源而不将其描述为某种容器?这对我来说似乎是最明显的解决方案。就“元类魔法”而言,恐怕我不会遵循,您可以将__getitem__ 方法添加到任何类定义中,您不能在没有一些技巧的情况下将其动态添加到对象实例中,但这很少见你会想要这样做。
  • 我正在考虑使用 User 类(作为单例)作为容器。困难在于将 getitem 实现为类方法(使用 @classmethod 装饰器)是not trivial

标签: python pyramid traversal magic-methods


【解决方案1】:

不要忘记映射到/users 的视图需要上下文。拥有一个 User 类会很困难,而且肯定不够优雅。

我的猜测是单独的UserContainer 将是您能找到的更简单的解决方案。根据您的数据库后端,您甚至可以以通用方式进行操作。例如,使用 SqlAlchemy:

class Container:
    def __getitem__(self, item):
        try:
            id = int(item)
            return DBSession.query(self.cls).filter_by(id=id).one()
        except (NoResultFound, ValueError):
            raise KeyError(item)

那么,你的UserContainer 就是:

class UserContainer(Container):
    cls = User

优雅,不是吗?

【讨论】:

  • 是的,我会使用一个单独的容器。来自 MVC,我发现模型逻辑与其在 webapp 中的使用分离是一种熟悉的模式。我想我只是对模型完全支持自身遍历的可能性很感兴趣。毕竟,您的 Container 的 getitem 非常类似于可以作为类方法实现的 User.find({'name': 'chris'}) 方法。这是一个巧妙的技巧。我正在使用 Mongo 后端,但我仍然可以使用您的想法,只需稍作修改。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2014-08-16
  • 2015-10-22
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
相关资源
最近更新 更多