理解Pyramid中的资源和上下文
请耐心听我说,因为我刚开始学习Pyramid框架。我在理解Pyramid中的上下文和资源时遇到了一些困难,尤其是在URL调度方面。文档中的描述让我有点困惑,上下文和资源的关系对我来说有点循环。
- Pyramid中的资源是什么?它只是URL想要表示的东西吗?比如,如果URL是
/organization/add_users
,那么资源是组织还是用户呢? - 在上面的例子中,上下文也是组织吗?
另外,
- 上下文对象到底是什么?
上下文对象应该包含什么?教程中的例子只有访问控制列表(ACL),而初始化方法里什么都没有。
class RootFactory(object): __acl__ = [(...some permissions...)] def __init__(self): pass
当发生异常(例如禁止访问)时,具体在什么情况下上下文会改变?
我能理解在出现像禁止访问这样的错误时,上下文会改变的原因,但在进行验证时,为什么我要抛出一个与不同视图调用(view_callable)关联的异常,这个异常会渲染到不同的模板,而我可以在同一个视图调用中直接渲染到不同的模板,而不需要抛出异常呢?(我在文档中看到过关于add_view的验证错误示例)
2 个回答
这里的例子并没有帮助,链接是: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。
不过,在遇到这个问题时,我发现了一些其他有用的东西。
首先,你之所以要关注这些内容,主要是因为在使用URL调度时,可能会用到Pyramid的认证系统。如果你对这个不感兴趣,那就可以完全忽略上下文和资源树,直接进行调度就行了。
资源树
Pyramid有一个独特的概念叫做资源树,简单来说就是一棵与路径对应的对象树。这个树是从根节点开始,沿着给定的路径向下遍历的。在遍历过程中,如果路径用完了或者树到了一个叶子节点,那么这个树中的对象就成了context
(上下文)。
在URL调度中,默认情况下是不会进行遍历的,因此上下文总是你资源树的根节点。
一般来说,你可以在应用中随意使用上下文。它被ACLAuthorizationPolicy用来判断权限。这是一个比较大的话题,我建议你看看我的演示,里面讲解了如何在URL调度中使用Pyramid的认证系统 [1].
异常处理
Pyramid中的异常处理有两种方式:
- 你可以在视图中使用
try: except:
来返回不同的响应。 - 你可以利用异常视图更普遍地处理应用中的异常。
需要注意的是,第二种方式是处理404页面和如果你使用Pyramid的认证系统时处理禁止访问页面所必需的。这是因为Pyramid内部会抛出NotFound和Forbidden异常,如果你想自定义这些异常的显示,就必须捕获并渲染它们。
当抛出异常时,如果有一个异常视图与该类型匹配,Pyramid会调用这个异常视图,并将异常作为新的上下文传入,这就是上下文变化的时刻。
我不太确定验证是否是一个好的异常视图示例。通常,视图是用来处理错误情况的,或者在应用的非视图部分中提前终止执行。例如,当你的视图无法连接到数据库时,或者你想返回一个4xx或5xx的响应时,你可能想处理并返回不同的页面。默认情况下,如果异常没有被处理,WSGI服务器会将其转化为一个通用的500页面。异常视图让你可以自定义这种行为。
最重要的是,这一切都是可选的。如果你感到困惑,不用担心,因为你可以在不使用这些功能的情况下使用Pyramid,等你变得更熟悉后,可以逐渐将它们融入到你的应用中。