2

我有一个 RootFactory 定义如下:

class RootFactory(object):
    __parent__ = None
    __name__ = None

    def __init__(self, request):
        self.request = request

    def __getitem__(self, key):
        if key == "user":
            dispatch = UserSelector(self.request)
            dispatch.__name__ = key
            dispatch.__parent__ = self
            return dispatch

class UserSelector(object):
    __parent__ = None
    __name__ = None

    def __init__(self, request):
        self.request = request

    def __getitem__(self, key):
        dispatcher = UserDispatcher(self.request)
        dispatcher.__name__ = key
        dispatcher.__parent__ = self
        return dispatcher

class UserDispatcher(object):
    __parent__ = None
    __name__ = None

    def __init__(self, request):
        self.request = request

    def __getitem__(self, key):
        user = self.request.db.query(User)
        user = user.get(key)
        if not user:
            raise KeyError
        dispatcher = UserDispatcher(self.request)
        dispatcher.__name__ = key
        dispatcher.__parent__ = self
        dispatcher.user = user
        return dispatcher

这是来自我继承的一个项目,我正试图弄清楚它是如何工作的。该项目是一个 sql alchemy 脚手架。因此,当一个GET请求进入时,创建localhost:6543/user一个实例RootFactory并执行该__getitem__方法。这将返回一个UserSelector.

是什么原因导致__getitem__执行UserSelector

此外,如果请求是一个PUTPOST什么实例化了该UserDispatcher对象?

在 myUserViews UserDispatch中作为PUT请求的上下文传递。当我尝试发送时,PUT我得到404 The resource could not be found. predicate mismatch了查看UserViews (request_method = GET,HEAD)。谓词在这里指的是什么?

PUT 数据有问题吗?

4

1 回答 1

0

是什么原因导致__getitem__执行UserSelector

最好的办法是阅读描述 Traversal 工作原理的Pyramid Traversal文档。

所以对于这样的 URL:

/user/test/

  1. 遍历器创建根工厂
  2. 遍历器获取根工厂,获取下一个 URL 元素 ( user) 并调用__getitem__根工厂,这将返回一个新对象
  3. 遍历器获取下一个 URL 元素 ( test) 并调用__getitem__新对象(在您的情况下为 a UserDispatcher

此外,如果请求是一个PUTPOST什么实例化了该UserDispatcher对象?

遍历是在您的视图查找开始之前完成的,并且严格基于 URL 中位于两个斜杠之间的每个元素。

/user/test/posts/有 3 个元素 ( user, test, posts)。因此UserDispatcher,只有当 URL 可以遍历到它时,您才会被实例化。

谓词在这里指的是什么?

这里的谓词是指您对视图设置的各种限制。当您告诉 Pyramid 视图只能为GETor HEAD(默认)执行时,它将拒绝所有其他 HTTP 动词。当 Pyramid 查找要为传入请求执行的视图时,它将尝试匹配谓词。现在,如果一个视图可以工作,但它的一个或多个谓词不匹配,则会引发错误,只有在已用尽寻找可能的匹配项时才会引发此错误。

一旦引发错误,它就会通过 Pyramid 传播并最终导致404 - Not Found错误。如果您希望视图与您的PUT请求相匹配,您将需要修改谓词。

于 2014-07-02T05:17:37.333 回答