【问题标题】:Understanding resource and context in Pyramid了解 Pyramid 中的资源和上下文
【发布时间】:2011-06-15 19:39:05
【问题描述】:

请多多包涵,因为我才刚刚开始使用 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 的验证错误示例)

【问题讨论】:

    标签: python resources url-routing pyramid


    【解决方案1】:

    首先,在使用 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,并且随着您变得更加舒适,您可以开始将它们合并到您的应用程序中。

    【讨论】:

      【解决方案2】:

      这里的例子没有帮助: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 。

      但是,在遇到教程中的障碍时,我了解到其他一些有用的东西在哪里。

      【讨论】:

      • 本教程也使用虚拟用户/组时也无济于事。最终,您似乎还需要进行一些遍历,如上面的示例所示。我真的希望本教程实际上向教程或食谱中的初学者展示了 authn 和 authz 以及更详细的示例。有些人可能不同意,但无论如何,作为初学者,我很难理解金字塔的 authn 和 authz 并且有一段时间很想不使用 Pyramid,因为我无法前进。
      猜你喜欢
      • 2012-01-15
      • 2019-09-29
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2016-08-07
      相关资源
      最近更新 更多