我从Nereid 3.2得到最大递归深度错误。我发现此错误的主要原因是jinja 模板中的 Babel dateformat 过滤器,例如
{{ blog_date | dateformat(format='MMM YY') }}
在调试时,我发现可能是 Nereid 的懒惰渲染功能的扬声器导致了这个问题。
我从Nereid 3.2得到最大递归深度错误。我发现此错误的主要原因是jinja 模板中的 Babel dateformat 过滤器,例如
{{ blog_date | dateformat(format='MMM YY') }}
在调试时,我发现可能是 Nereid 的懒惰渲染功能的扬声器导致了这个问题。
最后我得到了解决方案,这就是我到达那里的方式。
烧瓶递归深度错误的问题是不容易找到问题的根本原因,所以通过命中和试验方法我得到了问题的尾巴。
方法调用流程是这样的:
日期格式过滤器 > format_date() > to_user_timezone() > get_timezone()
现在 get timezone 方法在这里被覆盖为:
def get_timezone():
"""
Returns the timezone that should be used for this request as
`pytz.timezone` object. This returns `None` if used outside of
a request.
"""
ctx = _request_ctx_stack.top
tzinfo = getattr(ctx, 'babel_tzinfo', None)
if tzinfo is None:
babel = ctx.app.extensions['babel']
if babel.timezone_selector_func is None:
if not current_user.is_anonymous() and current_user.timezone:
tzinfo = timezone(current_user.timezone)
else:
tzinfo = timezone(ctx.request.nereid_website.timezone)
else:
rv = babel.timezone_selector_func()
if rv is None:
tzinfo = babel.default_timezone
else:
if isinstance(rv, basestring):
tzinfo = timezone(rv)
else:
tzinfo = rv
ctx.babel_tzinfo = tzinfo
return tzinfo
flask.ext.babel.get_timezone = get_timezone
从这里它调用 nereid_website 中的函数字段 timezone,默认情况下返回公司的timezone,这是一个不需要的字段。
最后,我在PR#229中解决了这个问题。欢迎审稿人!