10

请耐心等待,因为我刚刚开始使用 Pyramid。关于URL Dispatch,我无法理解 Pyramid 中的上下文和资源。我不太确定文档、上下文和资源中的描述意味着什么(对我来说)有点循环。

  • 什么是金字塔中的资源?它只是 url 试图代表的内容吗?例如,如果 url 是/organization/add_users,是资源组织还是用户?
  • 上面例子中的上下文也是组织吗?

还,

  • 上下文对象到底是什么?
  • 上下文对象应该包含什么?教程中的示例只有 ACL,init 方法中没有任何内容。

    class RootFactory(object):
    __acl__ = [(...some permissions...)]
    
    def __init__(self):
        pass
    
  • 当抛出异常(例如禁止)时,上下文究竟会在什么时候发生变化?

  • 当出现诸如 Forbidden 错误之类的事情时,我可以看到更改上下文的目的,但是在执行诸如验证之类的事情时,为什么我应该抛出一个使用不同的 view_callable 注册的异常,该异常会呈现到不同的模板,而我可以简单地在同一个 view_callable 中渲染到不同的模板而不是抛出异常?(我在文档中看到了 add_view 的验证错误示例)

4

2 回答 2

14

首先,在使用 URL Dispatch 时您甚至想要关心这些东西的主要原因是为了使用金字塔的身份验证系统。如果您不关心这一点,那么您可以完全忽略上下文和资源树并继续调度。

资源树

Pyramid 有一个独特的资源树概念,它实际上是映射到路径的对象树。这棵树从根向下遍历到所提供路径的末尾。在遍历过程中,如果路径耗尽或树碰到离开节点,则树中的对象现在是context.

在 URL Dispatch 中,不会发生遍历(默认情况下),因此上下文将始终是资源树的根。

通常,您可以将上下文用于应用程序中所需的任何内容。ACLAuthorizationPolicy 明确使用它来确定权限。这是一个完整的主题,我建议查看我的演示,该演示解释了如何将 Pyramid 的身份验证系统与 URL Dispatch [ 1 ] 一起使用。

例外

Pyramid 中的异常处理以两种不同的方式完成:

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

请注意,第二种方式是渲染 404 页面所必需的,如果您使用的是 Pyramid 的身份验证,则也需要禁用页面。这是因为 Pyramid 在内部抛出 NotFound 和 Forbidden 异常,如果你想自定义它们,你必须捕获和呈现它们。

当抛出异常并且注册了与该类型匹配的异常视图时,Pyramid 将调用异常视图并将异常作为新上下文传递,因此上下文发生更改。

我不确定验证是异常视图的一个很好的例子。更典型地,视图用于错误情况,或在应用程序的非视图部分中短路执行。例如,当您的视图无法连接到数据库时,或者当您想要返回 4xx 或 5xx 响应时,您可能想要处理并返回不同的页面。默认情况下,如果不处理异常,WSGI 服务器只是把它变成一个通用的 500 页面。异常视图允许您自定义该行为。

所有这一切的重要收获是它都是可选的。如果您感到困惑,请不要担心,因为您可以在没有这些东西的情况下使用 Pyramid,并且随着您变得更加舒适,您可以开始将它们合并到您的应用程序中。

于 2011-06-16T06:54:06.360 回答
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 。

然而,在教程中遇到这个问题时,我了解到其他一些有用的东西在哪里。

于 2011-07-01T22:58:58.360 回答