У меня есть приложение Django, которое использует систему шаблонов Django для создания своего (не HTML) вывода, кроме того, веб-интерфейс. Существует ряд страниц, на которых пользователь может создать шаблон для отчета, добавив {{}} теги для замены переменных и дополнительную библиотеку templatetag, чтобы отформатировать все.django шаблон двигателя с проверкой ошибок?
Однако нынешний способ я делаю это просто:
t = Template(component_template)
self.output_content = t.render(component_context)
который использует веб-выходной двигатель шаблона по умолчанию. У этого есть string_if_invalid
, установленный на None
, и ужасные предупреждения в руководстве о том, чтобы сломать страницы администратора, если вы его измените.
Так что, если пользователь получает либо опечатку в имени переменной в теге, она тихо игнорируется и выводит ее на выход. Если у них есть искаженный тег, он фактически убивает веб-приложение. Я ищу способ проверки шаблона во время редактирования, так что пользователь может быть предупрежден о необходимости внесения изменений.
Что я стремлюсь к что-то вроде вывода компилятора:
unknown variable 'ffsdfd' on line 33 of template
template syntax error on line 22 of template
Моя первая мысль была, чтобы создать новый шаблон Engine() и использовать его для этой одной цели, так что я мог заметить отличительную по умолчанию string_if_invalid
, но это ничего мне не говорит о недостающей/неправильной переменной.
engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'],
context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'],
app_dirs=settings.TEMPLATES[0]['APP_DIRS'])
t = Template(component_template, engine=engine)
try:
self.output_content = t.render(component_context)
except TemplateSyntaxError:
pass # do something useful here to collect error messages
Исключение TemplateSyntaxError работает, за исключением того, я не получаю никакой информации контекста, например, где ошибка на самом деле, и, конечно, я получаю только первый провал. Глядя в код django.template, он выглядит как внутреннее, есть какое-то расширенное исключение, которое имеет номер строки и токен, которые заставляли его задыхаться, но это не ускользнет от метода render().
Итак:
Как я могу получить полезную обработку ошибок для ошибок в отредактированные пользователем шаблонов? Должен ли я делать это совсем по-другому?
Aha! Поэтому на самом деле часть, которую я отсутствовала, была: «Если string_if_invalid содержит«% s », маркер формата будет заменен именем недопустимой переменной». (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (Но переход от str к исключению хороший!) – AnotherHowie