【问题标题】:My custom 404 page doesn't work (Pyramid framework)我的自定义 404 页面不起作用(金字塔框架)
【发布时间】:2012-03-05 18:16:31
【问题描述】:

我想在金字塔应用程序中显示我喜欢的 404 页面,但可以让它工作。在阅读了有关该主题的各种魔术文本后,我在代码中添加了这样的内容:

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

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

【问题讨论】:

  • 应该是 .mako 而不是 .mak?
  • 我使用 .mak,金字塔书也是如此......我认为两者都可以正常工作

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


【解决方案1】:

这是一个示例应用程序,它使用异常视图来捕获 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”(或其他任何未找到的内容)将返回“未找到!”。

【讨论】:

  • 是的,这行得通。问题仍然是为什么我的代码不起作用?你的回答给了我一个提示。看起来 (renderer="page_404.mak") 机器不适用于 404 处理程序。将代码替换为“手动”渲染后,我的代码可以正常工作,例如:render_to_response('page_404.mak', {page-params-here}, request=request)
【解决方案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

【讨论】:

  • 感谢您的重要提示!实际上我发现我的代码遇到了这两个问题。首先 - 我的模板没有生效(通过“renderer”参数指定模板不起作用)然后我没有引发异常而是返回了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2014-01-02
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
相关资源
最近更新 更多