自定义Pyramid错误消息

时间:2011-07-19 13:13:14

标签: python error-handling pyramid

我正在尝试找到一种在Pyramid应用程序中自定义错误消息(404,403)的方法。我找到了this doc,但目前还不清楚该怎么做。

我需要做什么来渲染其中一个模板(比如,templates / 404.pt)而不是标准的404消息。我在__init__.py添加了以下内容:

from pyramid.config import Configurator
from pyramid.httpexceptions import HTTPNotFound

import myapp.views.errors as error_views

<...>

def main(global_config, **settings):
    config = Configurator(settings=settings)
    config.add_static_view('static', 'myapp:static')
    config.add_route(...)
    <...>
    config.add_view(error_views.notfound, context=HTTPNotFound)
    return config.make_wsgi_app()

error_views.notfound看起来像

def notfound(request):
    macros = get_template('../templates/macros.pt')
    return {
            'macros': macros,
            'title': "HTTP error 404"
            }

当然它不起作用(在这种情况下如何指定模板名称?),甚至更多:它似乎根本没有被调用,而且它的代码被忽略了。

3 个答案:

答案 0 :(得分:2)

将它放在myapp.views.errors文件中:

from pyramid.renderers import render_to_response

def notfound(request):
    context['title'] = "HTTP error 404"
    return render_to_response('../templates/macros.pt', context)

请告诉我这是否适合您。

答案 1 :(得分:2)

您应该将add_view作为pyramid.exceptions例外的上下文传递,而不是pyramid.httpexceptions例外。

这对我有用:

def main(global_config, **settings):
    """
    This function returns a Pyramid WSGI application.
    """
    ...
    config.add_view('my_app.error_views.not_found_view',
        renderer='myapp:templates/not_found.pt',
        context='pyramid.exceptions.NotFound')

答案 2 :(得分:2)

从Pyramid 1.3开始,使用@notfound_view_config装饰器就足够了。现在无需在__init__.py中设置任何内容。 views.py:

有示例代码
from pyramid.view import notfound_view_config
@notfound_view_config(renderer='error-page.mako')
def notfound(request):
    request.response.status = 404
    return {}