Пирамида: Пользовательская страница 404 возвращается как "200 OK" - программирование
Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Собственно, в пирамиде 1.3 Там новый декоратор @notfound_view_config.

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

Ответ 3

Лучший способ сделать это - переопределить по умолчанию Не найденный вид:

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

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

Ответ 4

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