【问题标题】:Pyramid traversal金字塔遍历
【发布时间】:2014-07-02 13:17:56
【问题描述】:

我有一个 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 对象?

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

PUT 数据有问题吗?

【问题讨论】:

    标签: pyramid


    【解决方案1】:

    是什么导致__getitem__UserSelector 中执行?

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

    所以对于这样的 URL:

    /user/test/

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

    另外,如果请求是PUTPOST,什么会实例化UserDispatcher 对象?

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

    /user/test/posts/ 有 3 个元素(usertestposts)。所以你的UserDispatcher 只有在 URL 可以遍历到它时才会被实例化。

    谓词在这里指的是什么?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2019-09-14
      相关资源
      最近更新 更多