【问题标题】:404 error handling with mako template使用 mako 模板处理 404 错误
【发布时间】:2011-11-29 17:42:21
【问题描述】:

尝试在 404 错误上显示由 mako 渲染的模板,但它仍然显示带有cherrypy 页脚和附加消息的标准错误页面:|此外,自定义错误页面失败: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)

【问题讨论】:

    标签: python cherrypy mako


    【解决方案1】:

    您很可能在 404 处理程序中引发错误,我猜您没有设置像 this 这样的cherrypy 配置的request.error_response,以及关于response_body 检查this 的错误,您可能是使用错误的模板的body

    从 cmets 编辑:

    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 电话。

    但基本上问题是(正如您所指出的),您使用非关键字参数调用渲染,而预期的输入只是模板的关键字参数。

    【讨论】:

    • 我的 404.mako 只是一个普通的 html,没有任何包含。 request.error_response?我不明白 - 如何在我的情况下进行设置?
    • 我想通了!所以在class Root 之后添加_cp_config = {'error_page.404': error_page_404} 然后修改error_page_404 函数为: 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}) 现在可以了!
    • @Zhlobopotam 你能用格式很好的代码把它变成一个答案吗?
    【解决方案2】:

    所以,我想通了 :) 感谢 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)
    

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 1970-01-01
      • 2014-08-09
      • 2013-05-01
      • 2011-04-16
      • 2012-07-27
      • 2012-11-23
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多