Python 烧瓶,金杯2,巴别塔错误$&引用;性格

Python 烧瓶,金杯2,巴别塔错误$&引用;性格,python,flask,jinja2,python-babel,flask-babel,Python,Flask,Jinja2,Python Babel,Flask Babel,我已将代码从webapp2迁移到Flask。(我在谷歌应用程序引擎中部署我的代码) 但是,我无法再使用此字符串:“错误:最多%1$d个字符” 初始化 flask_app = Flask(__name__) babel = Babel(flask_app, default_domain='strings') Html模板 <div class="...">{{ _('error_long_value') | replace('%1$d', '200') }}</div>

我已将代码从webapp2迁移到Flask。(我在谷歌应用程序引擎中部署我的代码)

但是,我无法再使用此字符串:
“错误:最多%1$d个字符”

初始化

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

<div class="...">{{ _('error_long_value') | replace('%1$d', '200') }}</div>
{{{('error_long_value')| replace('%1$d','200')}
我知道这不是最佳用途,但我需要保留%1$d作为占位符。(它正在与webapp2合作)

日志:

。。。
文件“../libs/flask/templating.py”,第135行,在渲染模板中
上下文(ctx.app)
文件“../libs/flask/templating.py”,第117行,在_render中
rv=template.render(上下文)
文件“../libs/jinja2/environment.py”,第1008行,在渲染中
返回self.environment.handle\u异常(exc\u info,True)
文件“../libs/jinja2/environment.py”,第780行,在handle\u异常中
重放(exc_类型、exc_值、tb)
顶级模板代码中的第567行文件“../app/templates/filename.html”
{{{('error_long_value')| replace('%1$d','200')}
ValueError:索引29处不支持格式字符“$”(0x24)

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

很难从您的问题中准确判断到底发生了什么,但看起来您在Babel配置中的“error\u long_value”变量下有错误消息“error:Max%1$d characters”,并且希望显示输出的html中出现“错误:最多200个字符”。由于某些原因,正在处理的某些内容不喜欢“$”字符。您可以将占位符更改为不包含“$”的内容。这将至少解决一个问题。至于为什么它在webapp2中工作,可能是Babel或python的不同版本,或者谁知道是什么。
您可以检查的另一件事是,使用uu('error_long_value')调用的确切函数是否为babel gettext()?变量名是在哪里分配的?

这是一个双重问题,其原因是
flask
(更具体地说是
jinja
),当从模板解释文本并应用过滤器和/或上下文处理器时,它自由地使用
字符串%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>
{{my_gettext('error_long_value')|my_replace('%1$d','200')}

关于上一段,Jinja不知道/不关心HTML注释。只有Jinja注释会影响其行为(即停止代码运行)。删除“|替换(“%1$d”,“200”)时是否会发生错误" ? 如果是的话,那就是发生在巴别塔。什么是巴布尔版本?当我使用一美元的翻译时,错误总是发生。例如:{{{('error\u long\u value')}其中error\u long\u value是“error:Max%1$d个字符”,谢谢!@app.context\u处理器函数正是我所需要的。我用了{'':gettext}
<div class="...">{{ my_gettext('error_long_value') | my_replace('%1$d', '200') }}</div>