Flask, Jinja2, Babel ошибка на символе "$" - PullRequest
0 голосов
/ 27 декабря 2018

Я перенес свой код из 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

Я уже пытался использовать "| e" или "| safe" после "_ ('error_long_value')"в шаблоне HTML, удалив replace ().

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Это двоякая проблема, обусловленная тем фактом, что flaskjinja более конкретно) при интерпретации текста из шаблонов и применении фильтров и / или контекстных процессоров свободно использует операцию string % something.

Эта операция интерпретирует текст %1$d как строку форматирования, недопустимую, которая вызывает ошибку.Поэтому вам нужно заменить обе операции, которые вы выполняете в шаблоне, поскольку те, которые предусмотрены в flask (и его расширениях, обычно), могут вызвать ошибки из-за вышеупомянутой операции модуля.

Во-первых, вы можете создать контекстный процессор, используя непосредственно полученный текст gette:

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>
0 голосов
/ 30 декабря 2018

Трудно сказать по вашим вопросам, что именно происходит, но похоже, что у вас есть сообщение об ошибке «Ошибка: максимум% 1 $ d символов» в конфигурации Babel в переменной «error_long_value», и вы хотите сделать отображение «Ошибка:Максимум 200 символов "в выводимом html.И почему-то что-то на пути не нравится символу "$".Вы можете просто изменить местозаполнитель на то, что не содержит "$".Это решит хотя бы одну проблему.Что касается того, почему он работал в webapp2, это может быть другая версия Babel или python, или кто знает что.Другая вещь, которую вы можете проверить, это то, какая именно функция вызывается с помощью _ ('error_long_value'), это babel gettext ()?где назначено имя переменной?

...