请耐心等待,因为我才刚刚开始使用 Pyramid。关于 URL Dispatch,我无法理解 Pyramid 中的上下文和资源。我不太确定文档、上下文和资源中的描述是什么意思(对我来说)有些循环。
- Pyramid 中的资源是什么?这只是 url 试图代表的内容吗?
例如url为
/organization/add_users
,资源是组织还是用户? - 上例中的上下文也是组织吗?
此外,
- 上下文对象到底是什么?
上下文对象应该包含什么?教程中的示例只有ACL,init方法中没有任何内容。
class RootFactory(object): __acl__ = [(...some permissions...)] def __init__(self): pass
当抛出异常(例如禁止异常)时,上下文究竟在什么时候发生了变化?
当出现类似 Forbidden 的错误时,我可以看到更改上下文的目的,但是当进行类似验证的操作时,我为什么要抛出一个用不同的 view_callable 注册的异常,它会呈现不同的 View 模板,当我可以简单地渲染到同一 view_callable 中的不同模板而不是抛出异常时? (我在文档中看到了 add_view 的验证错误示例)
最佳答案
首先,您在使用 URL Dispatch 时想要关心这些东西的主要原因是为了使用 Pyramid 的身份验证系统。如果您不关心这些,那么您可以完全忽略上下文和资源树并继续进行调度。
资源树
Pyramid 有一个独特的资源树概念,从字面上看,它是一棵映射到路径的对象树。这棵树从根向下遍历到提供路径的末尾。在遍历过程中,如果路径耗尽或树遇到叶节点,则树中的该对象现在是 context
。
在 URL Dispatch 中,遍历不会发生(默认情况下),因此上下文将始终是资源树的根。
一般来说,您可以在应用程序中将上下文用于您想要的任何内容。 ACLAuthorizationPolicy 明确使用它来确定权限。这是一个完整的主题,我建议查看我的演示,它解释了如何使用 Pyramid 的身份验证系统和 URL Dispatch [ 1 ].
异常(exception)情况
Pyramid 中的异常处理以两种不同的方式完成:
- 您可以在 View 中使用
try: except:
来返回不同的响应。 - 您可以利用异常 View 更普遍地处理应用中的异常。
请注意,第二种方式是呈现 404 页面所必需的,如果您使用 Pyramid 的 auth,禁止页面也是如此。这是因为 Pyramid 内部会抛出 NotFound 和 Forbidden 异常,如果你想自定义它们,你必须捕获并渲染它们。
当抛出异常并且注册了一个异常 View 以匹配该类型时,Pyramid 将调用异常 View 并将异常作为新的上下文传入,所以这就是上下文发生变化的时候。
我不确定验证是异常 View 的一个很好的例子。更典型的情况是, View 用于错误情况,或在应用程序的非 View 部分短路执行。例如,当您的 View 无法连接到您的数据库时,或者当您想要返回 4xx 或 5xx 响应时,您可能希望处理和返回不同的页面。默认情况下,如果异常没有被处理,WSGI 服务器只是将它变成一个通用的 500 页面。异常 View 可让您自定义该行为。
所有这一切的重要收获是它都是可选的。如果您感到困惑,请不要担心,因为您可以在没有这些东西的情况下使用 Pyramid,并且随着您变得更加自如,您可以开始将它们合并到您的应用程序中。
关于python - 了解 Pyramid 中的资源和上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6363273/