理解Pyramid中的资源和上下文

10 投票
2 回答
3548 浏览
提问于 2025-04-16 19:38

请耐心听我说,因为我刚开始学习Pyramid框架。我在理解Pyramid中的上下文和资源时遇到了一些困难,尤其是在URL调度方面。文档中的描述让我有点困惑,上下文和资源的关系对我来说有点循环。

  • Pyramid中的资源是什么?它只是URL想要表示的东西吗?比如,如果URL是/organization/add_users,那么资源是组织还是用户呢?
  • 在上面的例子中,上下文也是组织吗?

另外,

  • 上下文对象到底是什么?
  • 上下文对象应该包含什么?教程中的例子只有访问控制列表(ACL),而初始化方法里什么都没有。

    class RootFactory(object):
    __acl__ = [(...some permissions...)]
    
    def __init__(self):
        pass
    
  • 当发生异常(例如禁止访问)时,具体在什么情况下上下文会改变?

  • 我能理解在出现像禁止访问这样的错误时,上下文会改变的原因,但在进行验证时,为什么我要抛出一个与不同视图调用(view_callable)关联的异常,这个异常会渲染到不同的模板,而我可以在同一个视图调用中直接渲染到不同的模板,而不需要抛出异常呢?(我在文档中看到过关于add_view的验证错误示例)

2 个回答

0

这里的例子并没有帮助,链接是:http://docs.pylonsproject.org/projects/pyramid/1.1/tutorials/wiki2/authorization.html#adding-login-and-logout-views,这个例子是错误的。

抛出的异常(至少在Pyramid 1.0-2版本中)是 pyramid.exceptions.Forbidden,而不是例子中提到的 pyramid.httpexceptions.HTTPForbidden。

不过,在遇到这个问题时,我发现了一些其他有用的东西。

14

首先,你之所以要关注这些内容,主要是因为在使用URL调度时,可能会用到Pyramid的认证系统。如果你对这个不感兴趣,那就可以完全忽略上下文和资源树,直接进行调度就行了。

资源树

Pyramid有一个独特的概念叫做资源树,简单来说就是一棵与路径对应的对象树。这个树是从根节点开始,沿着给定的路径向下遍历的。在遍历过程中,如果路径用完了或者树到了一个叶子节点,那么这个树中的对象就成了context(上下文)。

在URL调度中,默认情况下是不会进行遍历的,因此上下文总是你资源树的根节点。

一般来说,你可以在应用中随意使用上下文。它被ACLAuthorizationPolicy用来判断权限。这是一个比较大的话题,我建议你看看我的演示,里面讲解了如何在URL调度中使用Pyramid的认证系统 [1].

异常处理

Pyramid中的异常处理有两种方式:

  1. 你可以在视图中使用try: except:来返回不同的响应。
  2. 你可以利用异常视图更普遍地处理应用中的异常。

需要注意的是,第二种方式是处理404页面和如果你使用Pyramid的认证系统时处理禁止访问页面所必需的。这是因为Pyramid内部会抛出NotFound和Forbidden异常,如果你想自定义这些异常的显示,就必须捕获并渲染它们。

当抛出异常时,如果有一个异常视图与该类型匹配,Pyramid会调用这个异常视图,并将异常作为新的上下文传入,这就是上下文变化的时刻。

我不太确定验证是否是一个好的异常视图示例。通常,视图是用来处理错误情况的,或者在应用的非视图部分中提前终止执行。例如,当你的视图无法连接到数据库时,或者你想返回一个4xx或5xx的响应时,你可能想处理并返回不同的页面。默认情况下,如果异常没有被处理,WSGI服务器会将其转化为一个通用的500页面。异常视图让你可以自定义这种行为。

最重要的是,这一切都是可选的。如果你感到困惑,不用担心,因为你可以在不使用这些功能的情况下使用Pyramid,等你变得更熟悉后,可以逐渐将它们融入到你的应用中。

撰写回答