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

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

Overview

Bem-vindos, desenvolvedores e entusiastas do Flask! Hoje, vamos mergulhar em como tornar o Jinja2, o motor de templates do Flask, mais flexível e compatível com outros frameworks populares. Se você já se viu em um beco sem saída tentando fazer o Jinja2 coexistir pacificamente com Angular ou VueJS, este post é para você. Vou guiá-los através de um processo simples, mas vital, para personalizar os delimitadores do Jinja2, permitindo que você tire o máximo proveito do seu projeto Flask. Preparados? Vamos lá!

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:


<html>
<head>
    <meta charset="UTF-8">
    <strong><title>{{ title }}</title></strong>
</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:


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

</body>
</html>

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

Espero ter ajudado!