gpt4 book ai didi

python - Flask、Jinja2、 "$"字符上的 Babel 错误

转载 作者:行者123 更新时间:2023-11-28 18:05:08 26 4
gpt4 key购买 nike

我已将我的代码从 webapp2 迁移到 Flask。 (我在 Google App Engine 中部署我的代码)

但是,我不能再使用这个字符串:"Error: Max %1$d characters"

初始化

flask_app = Flask(__name__)
babel = Babel(flask_app, default_domain='strings')

HTML 模板

<div class="...">{{ _('error_long_value') | replace('%1$d', '200') }}</div>

我知道这不是最佳用途,但我需要将 %1$d 保留为占位符。 (它与 webapp2 一起工作)

日志:

...
File ".../libs/flask/templating.py", line 135, in render_template
context, ctx.app)
File ".../libs/flask/templating.py", line 117, in _render
rv = template.render(context)
File ".../libs/jinja2/environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File ".../libs/jinja2/environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File ".../app/templates/filename.html", line 567, in top-level template code
<div class="invalid-feedback">{{ _('error_long_value') | replace('%1$d', '200') }}</div>
ValueError: unsupported format character '$' (0x24) at index 29

我已经尝试在 HTML 模板中的“_('error_long_value')”之后使用“| e”或“| safe”,删除 replace()。

最佳答案

这是一个双重问题,因为 flask(更具体地说是 jinja)在从模板解释文本并应用过滤器和/或上下文处理器时, 它自由地使用 string % something 操作。

此操作将 %1$d 文本解释为格式字符串,这是导致错误的无效字符串。因此,您需要做的是替换您在模板中执行的两个操作,因为 flask(及其扩展,通常)提供的操作很可能会因上述模数操作而导致错误。

首先,您可以直接使用 babel gettext 创建一个上下文处理器:

from flask_babel import gettext
#...
@app.context_processor
def my_gettext():
return {'my_gettext': gettext}

现在是文本替换的过滤器:

@app.template_filter()
def my_replace(text, old, new):
return text.replace(old, new)

有了这个,在您的模板中您将使用:

<div class="...">{{ my_gettext('error_long_value') | my_replace('%1$d', '200') }}</div>

关于python - Flask、Jinja2、 "$"字符上的 Babel 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53948743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com