了解金字塔中的资源和上下文

时间:2011-06-15 19:39:06

标签: python resources url-routing pyramid

请耐心等待我,因为我刚刚开始使用金字塔。关于 URL Dispatch ,我无法理解Pyramid中的上下文和资源。我不太清楚文档中的描述意味着什么,上下文和资源有些循环(对我而言)。

  • 金字塔中的资源是什么?这只是网址试图代表的内容吗? 例如,如果网址是/organization/add_users,是资源组织还是用户?
  • 上述示例中的上下文是否也是组织?

此外,

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

    class RootFactory(object):
    __acl__ = [(...some permissions...)]
    
    def __init__(self):
        pass
    
  • 当抛出异常(例如,禁止)时,上下文的确切变化是什么时候?

  • 当有类似Forbidden错误之类的内容时,我可以看到更改上下文的目的,但是当执行类似验证的操作时,为什么要抛出一个使用不同的view_callable注册的异常,这会导致另一个异常模板,当我可以简单地渲染到同一view_callable中的不同模板而不是抛出异常? (我在文档中看到了add_view的验证错误示例)

2 个答案:

答案 0 :(得分:13)

首先,使用URL Dispatch时,你甚至想要关心这些东西的主要原因是为了使用金字塔的auth系统。如果您不关心这一点,那么您可以完全忽略上下文和资源树,然后继续发送。

资源树

Pyramid有一个独特的资源树概念,它实际上是一个映射到路径的对象树。此树从根向下遍历到提供的路径的末尾。在遍历期间,如果路径耗尽或树命中了离开节点,则树中的该对象现在为context

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

通常,您可以在应用程序中使用上下文。 ACLAuthorizationPolicy明确使用它来确定权限。这是一个完整的主题,我建议查看我的演示,解释如何使用Pyramid的auth系统和URL Dispatch [1]。

例外

金字塔中的异常处理有两种不同的方式:

  1. 您可以在视图中使用try: except:返回不同的回复。
  2. 您可以利用异常视图来更一般地处理应用中的异常。
  3. 请注意,第二种方式是渲染404页面所必需的,如果您正在使用Pyramid的auth,也是禁止的页面。这是因为如果你想自定义它们,Pyramid会在内部抛出你必须捕获和渲染的NotFound和Forbidden异常。

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

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

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

答案 1 :(得分: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。

然而,在教程中遇到障碍时,我学到了其他一些有用的东西。