¿Qué son los templates con Jinja?
Clase 24 de 29 • Curso de Fundamentos de Apache Airflow
Contenido del curso
Clase 24 de 29 • Curso de Fundamentos de Apache Airflow
Contenido del curso
Mauro Ezequiel Bravo
Nicolás Muriel
Eric Bellet
Royer Guerrero Pinilla
Alfonso Andres Zapata Guzman
Carlos Eduardo Bracho Rosales
Eric Bellet
Mario Alexander Vargas Celis
Federico Martinez
Federico Martinez
Erick Rea Reasco
Eric Bellet
Eric Bellet
from datetime import datetime from airflow import DAG from airflow.operators.bash import BashOperator templated_command = """ {% for file in params.filenames %} echo "{{ ds }}" echo "{{ file }}" {% endfor %} """ with DAG(dag_id="8-templating", description="Example using templates", schedule_interval="@daily", start_date=datetime(2022, 8, 10), end_date=datetime(2022, 8, 25), max_active_runs=1 ) as dag: t1 = BashOperator(task_id="tarea_1", bash_command=templated_command, params={"filenames": ["file1.txt", "file2.txt"]}, depends_on_past=True) t1
Wow, primera vez que mencionan dbt en platzi !
Recomendada para todos, es muy intuitiva, sobre todo si tenemos buenas bases en SQL.
Analytics Engineering tomando fuerza en el Modern Data Stack
Sí, posiblemente hagamos un curso pronto de DBT
📁 Este la herramienta que recomienda el profe al final de la clase https://docs.getdbt.com/docs/build/jinja-macros
Me alegra no ser el unico que lo busco, me aparecio la misma pagina de primera opcion en google.
~ Que tal Platzinauta, ya conectamos en LinkedIn? ~
¡Que estas esperando! Conectemos en LinkedIn, GitHub, Medium o Redes sociales
Un curso de DBT 🙏 please!!!
2024 seguro!
Los templates con Jinja son un mecanismo que permite generar contenido dinámico en aplicaciones y scripts utilizando el motor de plantillas Jinja2. Jinja2 es un motor de plantillas para Python ampliamente utilizado en herramientas como Flask, Django, y también en frameworks como Apache Airflow para crear configuraciones y comandos dinámicos.
Conceptos básicos
Un template es un archivo (generalmente texto o HTML) con marcadores de posición que pueden ser reemplazados dinámicamente por valores. Jinja2 permite utilizar variables, control de flujo (bucles y condicionales), y filtros para construir plantillas complejas.
Sintaxis básica
**Variables:**Hola, {{ nombre }}!
Esto reemplazará {{ nombre }} con el valor de la variable nombre.
Control de flujo:
Condicionales:{% if usuario %} Hola, {{ usuario }}! {% else %} Hola, invitado! {% endif %}
Bucles:{% for item in lista %} {{ item }} {% endfor %}
Filtros: Los filtros transforman datos, por ejemplo:{{ texto | upper }} # Convierte el texto a mayúsculas
Uso de Jinja en Apache Airflow
En Airflow, Jinja es crucial para construir comandos dinámicos en operadores como BashOperator, PythonOperator, o incluso configuraciones en tareas y sensores.
Ejemplo básico
Generar un archivo con un nombre dinámico basado en la fecha de ejecución:
from airflow import DAG from airflow.operators.bash import BashOperator from datetime import datetime
with DAG(dag_id="example_jinja", start_date=datetime(2024, 1, 1), schedule_interval="@daily", catchup=False) as dag:
t1 = BashOperator( task_id="create_file", bash_command="echo 'Archivo generado el {{ ds }}' > /tmp/archivo_{{ ds_nodash }}.txt" )
{{ ds }}: Representa la fecha de ejecución (por ejemplo, 2024-01-01).{{ ds_nodash }}: Fecha sin guiones (20240101), útil para nombres de archivos.Plantillas personalizadas
Puedes incluir variables adicionales en tus plantillas utilizando el argumento params:
t1 = BashOperator( task_id="custom_file", bash_command="echo 'Hola, {{ params.nombre }}!' > /tmp/saludo.txt", params={"nombre": "Mario"} )
Plantillas en otros contextos
HTML en aplicaciones web
Jinja es muy usado en frameworks como Flask o Django para generar contenido HTML dinámico.
<!DOCTYPE html> <html> <head> <title>Bienvenido</title> </head> <body> <h2>Hola, {{ usuario }}!</h2> <p>Hoy es {{ fecha | date('d/m/Y') }}.</p> </body> </html>
Configuraciones dinámicas
Jinja puede utilizarse en scripts de configuración, como YAML o JSON, para ajustar valores dinámicamente.
app_name: "{{ name }}" version: "{{ version }}"
Filtros útiles en Jinja
upper: Convierte a mayúsculas.
lower: Convierte a minúsculas.
replace: Reemplaza texto.{{ texto | replace('a', 'o') }}
default: Establece un valor predeterminado.{{ variable | default('valor por defecto') }}
Ventajas de Jinja
¿Qué problemas resuelve Jinja en Airflow?
Jinja resuelve el problema de la rigidez en los DAGs, permitiendo que las tareas se adapten a diferentes contextos o datos sin modificar el código. Esto facilita la reutilización de código y la creación de pipelines más genéricos. Ayuda a gestionar la información cambiante de un flujo de manera eficiente.
¿Cómo dinamizar tareas con Jinja?
Jinja permite insertar valores dinámicos en los parámetros de tus operadores, como fechas de ejecución o IDs de tareas, justo antes de que la tarea se ejecute. Esto evita la necesidad de "hardcodear" valores y hace que tus DAGs sean mucho más flexibles y reusables. Utiliza variables como {{ ds }} para acceder a la fecha de ejecución.
Como hago para guardar variables en Airflow de forma segura? por ejemplo tokens o API keys?
Algún servicio de secret manager puede ser una solución, por ejemplo AWS Secrets
Secrets, en mi caso yo suelo usar Amazon Secrets