Python 理解金字塔中的资源和语境

Python 理解金字塔中的资源和语境,python,resources,url-routing,pyramid,Python,Resources,Url Routing,Pyramid,请容忍我,因为我刚刚开始学习金字塔。我在理解金字塔中的上下文和资源时遇到困难,与URL调度有关。从文档、上下文和资源中的描述来看,我不太确定这意味着什么(对我来说) 金字塔中的资源是什么?这就是url试图表示的内容吗? 例如,如果url是/organization/add_users,则是资源组织还是用户 在上面的例子中,上下文也是组织吗 而且 什么是上下文对象 上下文对象应该包含什么?本教程中的示例仅包含ACL,而在init方法中没有任何内容 class RootFactory(obje

请容忍我,因为我刚刚开始学习金字塔。我在理解金字塔中的上下文和资源时遇到困难,与URL调度有关。从文档、上下文和资源中的描述来看,我不太确定这意味着什么(对我来说)

  • 金字塔中的资源是什么?这就是url试图表示的内容吗? 例如,如果url是
    /organization/add_users
    ,则是资源组织还是用户
  • 在上面的例子中,上下文也是组织吗
而且

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

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

  • 当出现禁止的错误时,我可以看到更改上下文的目的,但在执行验证等操作时,为什么要抛出一个注册到不同视图的异常,该视图可调用,并呈现到不同的模板,当我可以简单地渲染到同一视图中的不同模板,而不是引发异常时?(我在文档中看到了add_视图的验证错误示例)


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

资源树 金字塔有一个独特的资源树概念,它实际上是一个映射到路径的对象树。此树从根向下遍历到所提供路径的末尾。在遍历过程中,如果路径耗尽或树碰到一个离开节点,那么树中的对象现在就是
上下文

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

一般来说,您可以在应用程序中使用上下文来处理任何需要的内容。ACLAuthorizationPolicy显式使用它来确定权限。这是一个完整的主题,我建议查看我的演示,它解释了如何将Pyramid的auth系统与URL Dispatch[]结合使用

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

  • 您可以在视图中使用
    try:except:
    返回不同的响应
  • 您可以利用异常视图更一般地处理应用程序中的异常
  • 请注意,第二种方式是渲染404页所必需的,如果您使用的是Pyramid的auth,那么也需要禁用页。这是因为Pyramid在内部抛出NotFound和Forbidden异常,如果要自定义这些异常,必须捕获并呈现它们

    当抛出异常并且注册了一个与该类型匹配的异常视图时,Pyramid将调用异常视图并将异常作为新上下文传入,因此这就是上下文更改的时间

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


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

    这里的示例:是不正确的

    抛出的异常(至少与Pyramid 1.0-2相关)是Pyramid.exceptions.Forbidden;不是示例的pyramid.httpexceptions.HTTPForbidden


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

    当本教程使用虚拟用户/组时,这也没有帮助。最终,您似乎也需要进行遍历,如上面的示例所示。我真的希望本教程在教程或烹饪书中为初学者提供了一个更详细的示例来展示authn和authz。有些人可能不同意,但无论如何,作为初学者,我很难理解金字塔的authn和authz,有一段时间我很想不使用金字塔,因为我无法前进。