404 обработка ошибок с шаблоном мако - PullRequest
3 голосов
/ 03 октября 2011

Попытка отобразить шаблон, отображаемый mako на 404 ошибках, но он по-прежнему отображает стандартную страницу ошибок с вишневым нижним колонтитулом и дополнительным сообщением: | Кроме того, ошибка пользовательской страницы ошибки: TypeError: render_body () принимает ровно 1 аргумент (3 дано) )» Код:

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(status, message)
cherrypy.config.update({'error_page.404': error_page_404})

Нужна помощь! Как отобразить полностью настраиваемые страницы ошибок с моим макетом (шаблон mako)?

Полный код:

import sys
sys.stdout = sys.stderr
import os, atexit
import threading
import cherrypy
from mako.template import Template
from mako.lookup import TemplateLookup

cherrypy.config.update({'environment': 'embedded'})
if cherrypy.engine.state == 0:
    cherrypy.engine.start(blocking=False)
    atexit.register(cherrypy.engine.stop)

localDir = os.path.dirname(__file__)
absDir = os.path.join(os.getcwd(), localDir)
path = os.path.join(absDir,'files')
templ_path = os.path.join(absDir,'html')

tpl = TemplateLookup(directories=[templ_path], input_encoding='utf-8', output_encoding='utf-8',encoding_errors='replace')

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(status, message)
cherrypy.config.update({'error_page.404': error_page_404})

class Root:
    def index(self):
    tmpl = tpl.get_template("index.mako")       
    return tmpl.render(text = 'Some text',url = cherrypy.url())
index.exposed = True    

_application = cherrypy.Application(Root(), None)

import posixpath

def application(environ, start_response):
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
        return _application(environ, start_response)

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Скорее всего, вы вызываете ошибку в вашем обработчике 404, и я полагаю, что вы не устанавливаете request.error_response конфигурации cherrypy как this , а об ошибке response_body check это , вы, вероятно, неправильно используете тело шаблона.

Редактировать из комментариев:

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(stat=status, msg=message)

cherrypy.config.update({'error_page.404': error_page_404})

Метод render, задающий поведение функции только с аргументами ключевого слова, вы также можете быть немного более гибкими и указывать такую ​​же функцию, как эта:

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    args = {'stat': status,
            'msg': message}
    return tmpl.render(**args)

Это облегчит расширение ваших аргументов для шаблона, я обычно использую **args за мои render звонки.

Но в основном проблема заключалась в том (как вы указали), что вы вызываете визуализацию с аргументами не из ключевых слов, а ожидаемый ввод - это просто аргументы из ключевых слов для шаблона.

1 голос
/ 04 октября 2011

Итак, я разобрался :) Спасибо cyraxjoe!Вот код:

import sys
sys.stdout = sys.stderr
import os, atexit
import threading
import cherrypy
from mako.template import Template
from mako.lookup import TemplateLookup

cherrypy.config.update({'environment': 'embedded'})
if cherrypy.engine.state == 0:
    cherrypy.engine.start(blocking=False)
    atexit.register(cherrypy.engine.stop)

localDir = os.path.dirname(__file__)
absDir = os.path.join(os.getcwd(), localDir)
path = os.path.join(absDir,'files')
templ_path = os.path.join(absDir,'html')

tpl = TemplateLookup(directories=[templ_path], input_encoding='utf-8', output_encoding='utf-8',encoding_errors='replace')

def error_page_404(status, message, traceback, version):
    tmpl = tpl.get_template("404.mako")
    return tmpl.render(status, message)
cherrypy.config.update({'error_page.404': error_page_404})

class Root:
    _cp_config = {'error_page.404': error_page_404}
    def index(self):
    tmpl = tpl.get_template("index.mako")       
    return tmpl.render(text = 'Some text',url = cherrypy.url())
index.exposed = True    

_application = cherrypy.Application(Root(), None)

import posixpath

def application(environ, start_response):
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
        return _application(environ, start_response)
...