Пирамида: Пользовательская страница 404 возвращается как «200 OK»

У меня есть настраиваемый вид 404, определенный в моем приложении Pyramid:

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

Он отлично работает, за исключением того, что код состояния HTTP, отправленный с контентом, 200 OK, что не совсем нормально. У меня такая же проблема с 403 Forbidden. Как я могу заставить Pyramid отправить правильный код статуса?

Представление исключения представляет собой отдельное представление, которое предоставляет вам возможность делать все, что вы хотите. Как и любое представление, использующее средство визуализации, вы можете повлиять на объект ответа через request.response чтобы изменить его поведение. Затем рендеринг заполняет тело.

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

На самом деле, в пирамиде 1.3. Появился новый декоратор @notfound_view_config.

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

Лучший способ сделать это – переопределить по умолчанию Not Found View:

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

Чтобы привести пример со страницы, указанной выше

Вот как вы можете напрямую использовать крюк 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) 

Я сделал это для Talk Python To Me: http://www.talkpythontome.com/ , вот недействительная страница, чтобы увидеть настраиваемый шаблон.

http://www.talkpythontome.com/there_is_no_cat