2011-07-19 77 views
3

我試圖找到一種方法來自定義我的金字塔應用程序中的錯誤消息(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" 
      } 

確保它不工作(我怎麼在這種情況下,指定模板的名字嗎?),甚至更多:似乎視圖根本不被調用,並且代碼被忽略。

回答

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') 
+0

謝謝!這也適用於我。 – rvs

+0

在金字塔1.1(PyPI上可用)中,已解決... NotFound和Forbidden已合併到它們各自的HTTPException對象中。 –

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) 

讓我知道這對你的作品。

+0

謝謝,這就是我的看法應該如何,但是...它不起作用。我甚至可以在那裏寫'a = b/0'這樣的東西,並且不會在任何地方記錄異常。所以,看起來我在添加視圖時做錯了什麼。 – rvs

2

從金字塔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 {}