请耐心等待我,因为我刚刚开始使用金字塔。关于 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的验证错误示例)
答案 0 :(得分:13)
首先,使用URL Dispatch时,你甚至想要关心这些东西的主要原因是为了使用金字塔的auth系统。如果您不关心这一点,那么您可以完全忽略上下文和资源树,然后继续发送。
Pyramid有一个独特的资源树概念,它实际上是一个映射到路径的对象树。此树从根向下遍历到提供的路径的末尾。在遍历期间,如果路径耗尽或树命中了离开节点,则树中的该对象现在为context
。
在URL Dispatch中,不会发生遍历(默认情况下),因此上下文将始终是资源树的根目录。
通常,您可以在应用程序中使用上下文。 ACLAuthorizationPolicy明确使用它来确定权限。这是一个完整的主题,我建议查看我的演示,解释如何使用Pyramid的auth系统和URL Dispatch [1]。
金字塔中的异常处理有两种不同的方式:
try: except:
返回不同的回复。请注意,第二种方式是渲染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。
然而,在教程中遇到障碍时,我学到了其他一些有用的东西。