今天在看pylonshq.com的error的处理机制。它与默认的错误处理有些不同。首先在controller上,可以看到error.py
class ErrorController(BaseController):
......
def document(self, ARGS):
"""
Change this method to change how error documents are displayed
"""
if str(ARGS.get('code')) == '404':
c.referer = request.environ.get('HTTP_REFERER')
m.subexec('/errors/404.myt')
else:
c.code = ARGS.get('code')
c.message = ARGS.get('message')
m.subexec('/errors/generic.myt')
错误处理的开始配置在config下的middleware.py中make_app()
app = ErrorDocuments(app, global_conf, mapper=error_mapper, **app_conf)
error_mapper是在pylons包中middlerware.py中定义:
def error_mapper(code, message, environ, global_conf={}, kw={}):
codes = [401, 403, 404]
if not asbool(global_conf.get('debug', 'true')):
codes.append(500)
if code in codes:
url = '%s/error/document/?%s'%(get_prefix(environ), urlencode({'message':message, 'code':code}))
return url
可以注意到/error/document/这个url,它就会通过routing匹配到前面的error.py中的document方法。上面这是error的“来龙”。它的“去脉”呢?
作为pylonshq.com站点来说,它的错误处理要求统一,所以它比默认的模板进行了小的调整:如果是http的错误状态是404,即”没有找到“
if str(ARGS.get('code')) == '404':
c.referer = request.environ.get('HTTP_REFERER')
m.subexec('/errors/404.myt')
它获取错误状态的方式是ARGS.get('code'),ARGS是myghty中一个特殊全局变量,它是一个字典类型。HTTP_REFERER是这次点击的页面之前的链接来源。从而在404.myt中显示,返回。
错误状态是其它的话,
c.code = ARGS.get('code')
c.message = ARGS.get('message')
m.subexec('/errors/generic.myt')
generic.myt的内容也很简单:
<h1 id="error">Error <% c.code | h %></h1>
<p><% c.message | h %></p>
很奇怪的是其中的h,不知道这样执行h,其中的含义是什么?心存疑惑。
