使用Mako模板处理404错误
我想在出现404错误时显示用mako模板渲染的自定义页面,但它还是显示了带有cherrypy底部信息的标准错误页面,并且还有一个额外的错误信息:|此外,自定义错误页面失败了:TypeError: render_body()需要一个参数(但给了三个)。
代码如下:
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 个回答
1
所以,我搞明白了 :) 多亏了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)
2
你很可能在处理404错误的时候出现了问题,我猜是因为你没有像这个链接里说的那样设置request.error_response
。至于response_body
的错误,可以参考这个链接,你可能在使用模板的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)
这样做会让你在模板中扩展参数变得更简单,我通常在调用render
的时候使用**args
。
但基本上问题在于(正如你所指出的),你在调用render的时候使用了非关键字参数,而模板期望的输入是关键字参数。