Моя пользовательская страница 404 не работает (фреймворк Pyramid) - PullRequest
0 голосов
/ 14 февраля 2012

Я хочу показать свою причудливую страницу 404 в приложении пирамиды, но могу заставить ее работать.Прочитав различные магические тексты на эту тему, я добавил в свой код что-то вроде этого:

cfg.add_view( "Page_not_found_view", renderer="page_404.mak", 
               context=HTTPNotFound )

Но, хотя вызывается мой обработчик * Page_not_found_view * (я вижу его след), я все равно получаю такой плохой "по умолчанию "404 страницы вместо * моей собственной page_404.mak *.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Вот пример приложения, которое использует представление исключений, чтобы перехватить представление pyramid.httpexceptions.HTTPNotFound, созданное Pyramid, когда не может быть найдено представление, которое соответствует:

from waitress import serve
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('<html><body>Hello world!</body></html>')

def notfound(request):
    return Response('<html><body>Not found!</body></html>')

if __name__ == '__main__':
    config = Configurator()
    config.add_view(hello_world)
    config.add_view(notfound, context='pyramid.httpexceptions.HTTPNotFound')
    app = config.make_wsgi_app()
    serve(app, host='0.0.0.0')

При посещении '/' будет возвращено "Helloworld! ", посещение" / abc "или" / def "(или чего-либо еще, что не найдено) вернет" Not found! ".

2 голосов
/ 14 февраля 2012

То, что написал @ chris-mcdonough, должно работать в большинстве случаев.Однако, если вы используете matchdict в своем представлении, которое вызывается, и хотите показать свою пользовательскую страницу 404, когда ничего не совпадает, убедитесь, что вы подняли исключение HTTPNotFound вместо его возврата.В противном случае вы получите страницу по умолчанию 404.

Пример:

from pyramid import httpexceptions

def my_page(self):
    id = self.request.matchdict.get('id', None)
    if not id:
        raise httpexceptions.HTTPNotFound()
    else:
        # do whatever here
...