2012-03-22 68 views
16

我在金字塔的應用程序定義一個自定義的404視圖:金字塔:自定義404名錯誤頁面返回的「200 OK」

@view_config(context=HTTPNotFound, renderer='404.pt') 
def not_found(self, request): 
    return {} 

它工作正常,除了與內容發送的HTTP狀態代碼是200 OK ,這是不行的。我與403 Forbidden有同樣的問題。我怎樣才能讓金字塔發送正確的狀態碼?

回答

19

例外視圖鏈接的頁面取的例子是,它提供了光點FO一個單獨的視圖你可以做任何你想做的事情。就像任何使用渲染器的視圖一樣,您可以通過request.response影響響應對象以修改其行爲。渲染器然後填充身體。

@view_config(context=HTTPNotFound, renderer='404.pt') 
def not_found(self, request): 
    request.response.status = 404 
    return {} 
+2

完美!但是,一個更正:狀態應該是'404 Not Found'。從金字塔文檔:「response.status - 響應代碼加上原因消息,如'200 OK'要設置沒有消息的代碼,請使用status_int ,即:response.status_int = 200.「 – 2012-03-22 02:41:49

+3

如果你se把它作爲一個整數,它將在其內部查找表中查找狀態併爲你填充字符串。這是一個方便的皺紋,可能應該記錄得更好。 – 2012-03-22 03:56:52

0

做到這一點,最好的辦法就是覆蓋默認未找到查看:

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/hooks.html#changing-the-not-found-view

即使在這種情況下,您需要返回其具有404狀態正確的響應對象:

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

向來自上述

+0

但是,這並不讓我用一個變色龍模板... :( – 2012-03-22 01:43:53

+0

你可以,你自己呈現模板,或者,我相信變色龍渲染器將讓你返回一個Response對象和那麼,如果你做了你上面發佈的內容,但是返回Response(status ='404 Not Found'),我相信它會通過變色龍提供一個空的字典並帶有正確的響應代碼。 – turtlebender 2012-03-22 02:19:09

6

實際上,在金字塔1.3有一個新的裝飾@notfound_view_config。

@notfound_view_config(renderer = '404_error.jinja2') 
def notfound(request): 
    request.response.status = 404 
0

下面是如何直接使用404鉤子並呈現模板的過程。

在你INIT的.py:

config.add_notfound_view(not_found) 

在你view.py:

from pyramid.view import notfound_view_config 
from pyramid.renderers import render_to_response 

def not_found(request): 
    request.response.status = 404 
    t = 'talk_python_to_me_com:templates/errors/404.pt' 
    return render_to_response(t, {}, request) 

我這樣做是爲了談Python的對我說:​​,這裏是一個無效的頁面看到自定義模板呈現。

http://www.talkpythontome.com/there_is_no_cat