我的自定义404页面不起作用(金字塔框架)

时间:2012-02-14 11:13:44

标签: python http-status-code-404 pyramid

我想在金字塔应用中展示我喜欢的404页面,但可以让它运行起来。在阅读了关于这个主题的各种魔术文本之后,我在我的代码中添加了这样的东西:

cfg.add_view( "Page_not_found_view", renderer="page_404.mak", 
               context=HTTPNotFound )

但是当我的* Page_not_found_view *处理程序被调用时(我可以看到它的'跟踪)我仍然得到那个可怜的“默认”404页面,而不是*我自己的page_404.mak *。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这是一个示例应用程序,当没有找到匹配的视图时,使用异常视图来捕获Pyramid引发的pyramid.httpexceptions.HTTPNotFound视图:

from waitress import serve
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('<html><body>Hello world!</body></html>')

def notfound(request):
    return Response('<html><body>Not found!</body></html>')

if __name__ == '__main__':
    config = Configurator()
    config.add_view(hello_world)
    config.add_view(notfound, context='pyramid.httpexceptions.HTTPNotFound')
    app = config.make_wsgi_app()
    serve(app, host='0.0.0.0')

访问'/'将返回“Hello world!”,访问“/ abc”或“/ def”(或其他任何未找到的内容)将返回“Not found!”。

答案 1 :(得分:2)

在大多数情况下,@ chris-mcdonough所写的内容应该有用。但是,如果您在视图中使用matchdict可调用并且想要在没有匹配时显示自定义404页面,请确保引发HTTPNotFound异常而不是返回它。否则,您将获得默认的404页面。

示例:

from pyramid import httpexceptions

def my_page(self):
    id = self.request.matchdict.get('id', None)
    if not id:
        raise httpexceptions.HTTPNotFound()
    else:
        # do whatever here