python - 了解 Pyramid 中的资源和上下文

标签 python resources url-routing pyramid

请耐心等待,因为我才刚刚开始使用 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 中的异常处理以两种不同的方式完成:

  1. 您可以在 View 中使用 try: except: 来返回不同的响应。
  2. 您可以利用异常 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/

相关文章:

python - Matplotlib - 如何为具有对数刻度的线图设置颜色条

python - 在 python 中列出 "quirk"

python - 如何判断从列表中随机选择的字符串是相同的

.net - 在 .NET 可执行文件中自动嵌入多个图标

javascript - 使用 Angular 的原生 ngRoute(Angular-route.js v1.3.15) 嵌套 View ?

php - 关闭 Kohana 3 中的默认路由?

python - 无法根据 ('float64' 将数组数据从 dtype ('int32' ) 转换为 dtype 'safe' )

algorithm - 寻求的资源分配算法

xcode - 组织 xcode 4.0 复制 bundle 资源

jquery - NoReverseMatch at/product/pussyes/Reverse 找不到 'basket_adding'。 'basket_adding' 不是有效的 View 函数或模式名称