Alterando delimitadores padrão de template do Jinja2. (Python)

Para quem não conhece, Jinja2 é o sistema de template que vem com o Flask. Se você usa o Flask, você usa o Jinja2, não tem como desliga-lo e isso vai ser um problema se você utilizar algum outro framework que use os mesmos delimitadores (tipo Angular ou VueJS). Uma alternativa seria seria utilizar o pacote Flask-RESTful, mas o modo de utilização dele é um pouco diferente do Flask normal, ou seja, não da só para trocar os pacotes. Neste post mostro como alterar os delimitadores do Jinja2 para que eles não gerem incompatibilidade.

Vamos começar com um  template HTML simples:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>

</body>
</html>

Neste template, utilizo a sintaxe {{ title }} para definir o titulo da pagina. A variável title é definida no backend e utilizada pelo Jinja2 (que é responsável pela renderização das páginas).

 

Agora vamos alterar as configurações do Jinja2 no lado Python do processo:

# -*- coding: utf-8 -*-
from flask import Flask, render_template, jsonify


app = Flask(__name__)
jinja_options = app.jinja_options.copy()

jinja_options.update(dict(
    block_start_string='<%',
    block_end_string='%>',
    variable_start_string='%%',
    variable_end_string='%%',
    comment_start_string='<#',
    comment_end_string='#>'
))
app.jinja_options = jinja_options


@app.route('/', methods=['GET', 'POST'])
def index():
    return render_template('index.html')

No template acima, temos os seguintes comandos. Explicando:

  1. app = Flask(__name__) – Criando instancia da aplicação Flask;
  2. jinja_options = app.jinja_options.copy() – Gerando uma copia das configurações do Jinja2. Isso é necessário, pois as configurações ficam em um ImmutableDict e (surpresa!) você não consegue alterar um objeto deste tipo.
  3. jinja_options.update(dict( … )) – Aqui alteramos os valores dos delimitadores.
  4. app.jinja_options = jinja_options – Neste comando, as configurações do Jinja2 são atualizadas com a versão modificada que criamos no passo anterior.

 

Agora que os delimitadores foram alterados, o template precisa ser modificado para funcionar:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>%% title %%</title>
</head>
<body>

</body>
</html>

 

Agora ele vai continuar funcionando corretamente e você pode utilizar outros frameworks sem problemas.

Espero ter ajudado!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , .