Как вы включаете код фляжки / jinja2 внутри файла уценки?

Я использую редактор уценки, который преобразуется

post_body = markdown(text_from_markdown_editor) 

но когда я рисую html, отображается фактический код jinja2

 This is a post by {{ post.author }} 

вместо фактического значения.

One Solution collect form web for “Как вы включаете код фляжки / jinja2 внутри файла уценки?”

Я видел, как эта проблема возникла в последнее время в разных местах, как в отношении Jinja, так и Django Templates. Кажется, существует фундаментальное недоразумение (среди некоторых пользователей) о том, как работают системы шаблонов и как это относится к тексту Markdown, который отображается в HTML и вставлен в шаблон. Я постараюсь это объяснить. Обратите внимание, что, хотя нижеприведенный ответ относится к большинству систем шаблонов (включая Jinja и Django), примеры используют Jinja для иллюстративных целей (в конце концов, исходный вопрос конкретно задает вопрос о Jinja). Просто адаптируйте код, чтобы он соответствовал API вашей системы шаблонов, и он должен работать так же хорошо.

Прежде всего, Markdown не знает синтаксиса шаблона. Фактически, Markdown был дольше, чем Jinja, Django или другие популярные системы шаблонов. Кроме того, в правилах синтаксиса Markdown не упоминается синтаксис шаблонов. Поэтому ваш синтаксис шаблонов не будет обрабатываться просто путем передачи некоторого текста Markdown, который содержит синтаксис шаблона с помощью анализатора Markdown. Синтаксис шаблона должен обрабатываться отдельно механизмом шаблона. Например:

 from jinja2 import Environment # Set up a new template environment env = Environment() # Create template with the markdown source text template = env.from_string(text_from_markdown_editor) # Render that template. Be sure to pass in the context (post in this instance). template_processed_markdown = template.render(post=post) # Now pass the Markdown text through the Markdown engine: post_body = markdown(template_processed_markdown) 

Обратите внимание, что вышеописанное сначала обрабатывает синтаксис шаблона, затем анализирует Markdown. Другими словами, вывод обработки шаблона по-прежнему является текстом Markdown, при этом теги заменяются соответствующими значениями. Только в последней строке – текст Markdown, преобразованный в HTML парсером Markdown. Если вы хотите, чтобы порядок обработки был отменен, вам нужно будет переключить код, чтобы сначала запустить анализатор Markdown, а затем передать результат этого через процессор шаблонов.

Я предполагаю, что некоторая путаница исходит от людей, передающих текст Markdown через систему шаблонов. Не следует ли заставить синтаксис шаблона обрабатываться? Короче говоря, нет.

По своей сути система шаблонов принимает шаблон и контекст. Затем он находит различные теги в шаблоне и заменяет эти теги соответствующими данными, предоставленными в контексте. Тем не менее, шаблон не знает данных в контексте и не обрабатывает эти данные. Например, этот шаблон:

 Hello, {{ name }}! 

И этот контекст:

 output = template(name='John') 

Результатом будет следующий вывод:

 Hello, John! 

Однако, если бы это был контекст:

 output = template(name='{(some_template_syntax)}') 

то выход будет:

 Hello, {{some_template_syntax}}! 

Обратите внимание, что хотя данные в контексте содержат синтаксис шаблона, шаблон не обрабатывал эти данные. Он просто считал это значением и вставлял его как есть в шаблон в соответствующем месте. Это нормальное и правильное поведение.

Иногда, однако, у вас может быть законная потребность в шаблоне для дополнительной обработки некоторых данных, переданных в шаблон. По этой причине система шаблонов предлагает фильтры. При задании переменной в контексте фильтр обрабатывает данные, содержащиеся в этой переменной, а затем вставляет эти обработанные данные в шаблон. Например, чтобы гарантировать, что имя в нашем предыдущем примере заглавное, шаблон будет выглядеть следующим образом:

 Hello, {{ name|capatalize }}! 

Передача в контексте output = template(name='john') (обратите внимание, что имя имеет нижний регистр), затем получаем следующий результат:

 Hello, John! 

Обратите внимание, что данные в переменной name были обработаны за счет того, что первая буква была заглавной, что является функцией встроенного фильтра Jinja. Тем не менее, этот фильтр не обрабатывает синтаксис шаблона, поэтому передача синтаксиса шаблона к этому фильтру не приведет к обработке синтаксиса шаблона.

Эта же концепция применяется к любому фильтру markdown . Такой фильтр только анализирует предоставленные данные как текст Markdown и возвращает текст HTML, который затем помещается в шаблон. Никакой обработки синтаксиса шаблона не произойдет в таком сценарии. Фактически, это может привести к возможной проблеме безопасности, особенно если текст Markdown предоставляется ненадежными пользователями. Поэтому любой текст Markdown, содержащий синтаксис шаблона, должен иметь синтаксис шаблона, обрабатываемый отдельно.

Однако следует отметить осторожность. Если вы пишете документацию, которая включает в себя примеры синтаксиса шаблона в них как блоки кода (например, источник Markdown для этого ответа), система шаблонов не будет знать разницу и будет обрабатывать те теги, как и любой синтаксис шаблона, а не код блок. Если сначала была обработана обработка Markdown, чтобы полученный HTML-код был передан системе шаблонов, этот HTML-код по-прежнему будет содержать неизмененный синтаксис шаблона в кодовых блоках, которые все еще будут обрабатываться системой шаблонов. Скорее всего, это не то, что желательно в любом случае. В качестве обходного пути можно было бы создать какое-то расширение Markdown, которое добавило бы обработку синтаксиса самому процессору Markdown. Однако механизм для этого будет отличаться в зависимости от того, какой процессор Markdown используется и выходит за рамки этого вопроса / ответа.

  • Я не понимаю Jinja2 Call Blocks
  • Как я могу отправлять переменные в шаблон Jinja из декоратора Flask?
  • Как расширить базовый шаблон Flask Jinja из шаблона Blueprint?
  • Если разметка jinja находится в строчном формате, как ее использовать в django и jinja2?
  • Словарь Python в таблице html
  • Ошибка Python Jinja при сравнении строки
  • Цикл Jinja на вложенном списке создает пустой вывод
  • Периодически обновлять и отображать значение из колбы
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.