Пирамида: пользовательская страница 404 возвращается как "200 OK" - PullRequest
17 голосов
/ 22 марта 2012

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

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

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

Ответы [ 4 ]

19 голосов
/ 22 марта 2012

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

@view_config(context=HTTPNotFound, renderer='404.pt')
def not_found(self, request):
    request.response.status = 404
    return {}
7 голосов
/ 21 июня 2013

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

@notfound_view_config(renderer = '404_error.jinja2')
def notfound(request):
    request.response.status = 404
0 голосов
/ 09 апреля 2015

Вот как вы можете напрямую использовать хук 404 и визуализировать шаблон при этом.

В вашем init .py:

config.add_notfound_view(not_found)

По вашему мнению.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

0 голосов
/ 22 марта 2012

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

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

Взять пример со страницы, указанной выше

...