2012-07-17 63 views
2

后备视图考虑下面的金字塔应用:定义在遍历

from pyramid.config import Configurator 

class Foo(dict): 
    pass 

def make_root(request): 
    return {'foo': Foo()} 

def foo(request): 
    return request.subpath 

def bar(request): 
    return {"whoami": "bar", "subpath": request.subpath} 

def start(global_config, **settings): 
    config = Configurator(settings=settings) 
    config.set_root_factory(make_root) 
    config.add_view(foo, context=Foo, renderer="json") 
    config.add_view(bar, name="bar", context=Foo, renderer="json") 
    return config.make_wsgi_app() 

此应用程序使用穿越和响应/foo/foo/bar就好了。我在想,如果,遍历/foo/booarns的时候,有一些地方在穿越之前决定返回一个404像一个默认挂钩,或后备观点:

config.add_view(any_other, name="*default*", context=Foo, ...) 

然后,这一观点将被调用时路径的第二个组件尚未绑定到任何其他视图,但在相同的上下文中,路径组件仍可用为request.view_namerequest.subpath

回答

4

我认为containment谓词仍然会在这里工作。

@notfound_view_config(containment=Foo) 
def notfound(request): 
    return HTTPNotFound('no views for Foo detected for view %s' % request.view_name) 
+0

确实。它从来没有发生过,因为它很好地隐藏在API参考中。非常感谢。 – C2H5OH 2012-07-17 20:35:59

0

According to the docs,你只需要指定一个空字符串名称:

config.add_view(any_other, name="", context=Foo, ...) 
+0

这是行不通的,已经试过了。 – C2H5OH 2012-07-17 15:43:16

0

当金字塔是无法映射URL查看代码,它会触发一个“找不到视图”。默认“找不到视图”可以通过应用程序配置使用以下覆盖:

from pyramid.view import notfound_view_config 

@notfound_view_config() 
def notfound(request): 
    return Response('Not Found, dude', status='404 Not Found') 

def main(globals, **settings): 
    config = Configurator() 
    config.scan() 
+0

但是如果我想针对不同的情况单独做这件事,我必须派遣自己,对吧? – C2H5OH 2012-07-17 15:44:23

+0

任何时候收到内部的NotFound响应都会触发'notfound_view_config()'装饰器。 – RobB 2012-07-17 15:49:18