2

我从Nereid 3.2得到最大递归深度错误。我发现此错误的主要原因是jinja 模板中的 Babel dateformat 过滤器,例如

{{ blog_date | dateformat(format='MMM YY') }}

在调试时,我发现可能是 Nereid 的懒惰渲染功能的扬声器导致了这个问题

4

1 回答 1

3

最后我得到了解决方案,这就是我到达那里的方式。

烧瓶递归深度错误的问题是不容易找到问题的根本原因,所以通过命中和试验方法我得到了问题的尾巴。

方法调用流程是这样的:

日期格式过滤器 > 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中解决了这个问题。欢迎审稿人!

于 2014-11-18T17:24:41.230 回答