编程语言
首页 > 编程语言> > python-使用mako模板进行404错误处理

python-使用mako模板进行404错误处理

作者:互联网

试图显示由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)

解决方法:

您最有可能在404处理程序中引发错误,我想您未设置Cherrypy配置的request.error_response(如this),并且关于response_body检查this的错误,您可能使用了错误的模板body.

从评论中编辑:

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,而预期的输入只是关键字参数.

标签:mako,cherrypy,python
来源: https://codeday.me/bug/20191207/2087121.html