2012-02-14 4 views
0

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

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

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

+0

Если будет .mako и не .MAK? –

+0

Я использую .mak, а также книга пирамиды ... я думаю, что она работает нормально – Sheena

ответ

3

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

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

Посещение «/» будет возвращать «Привет мир ! ", посещение"/abc "или"/def "(или что-либо еще, что не найдено) вернет« Не найден! ».

+0

Да, это работает. Тем не менее вопрос заключается в том, почему мой код не работал? Ваш ответ дает мне подсказку. Похоже, что оборудование (renderer = "page_404.mak") не работает для 404 обработчиков. Я получил свой код после замены его «ручным» рендерингом, например: render_to_response ('page_404.mak', {page-params-here}, request = request) –

2

В чем дело @ chris-mcdonough должно работать в большинстве случаев. Тем не менее, если вы используете сопоставление в своем отзыве и хотите показать свою собственную страницу 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 
+0

Спасибо за важное замечание! На самом деле я обнаружил, что мой код страдал от обеих проблем. Прежде всего - мой шаблон не действует (указание шаблона с помощью параметра «renderer» не работает), а затем я не создал исключение, но вместо него вернул его. –

Смежные вопросы