blob: 1c8f42e3432d6ea974710ad85497c890dce44a95 [file] [log] [blame]
.. Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
.. http://www.apache.org/licenses/LICENSE-2.0
.. Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
.. _templates-ref:
Templates reference
===================
Variables, macros and filters can be used in templates (see the :ref:`concepts:jinja-templating` section)
The following come for free out of the box with Airflow.
Additional custom macros can be added globally through :doc:`authoring-and-scheduling/plugins`, or at a DAG level through the
``DAG.user_defined_macros`` argument.
.. _templates:variables:
Variables
---------
The Airflow engine passes a few variables by default that are accessible
in all templates
=========================================== ===================== ===================================================================
Variable Type Description
=========================================== ===================== ===================================================================
``{{ data_interval_start }}`` `pendulum.DateTime`_ Start of the data interval. Added in version 2.2.
``{{ data_interval_end }}`` `pendulum.DateTime`_ End of the data interval. Added in version 2.2.
``{{ ds }}`` str | The DAG run's logical date as ``YYYY-MM-DD``.
| Same as ``{{ dag_run.logical_date | ds }}``.
``{{ ds_nodash }}`` str Same as ``{{ dag_run.logical_date | ds_nodash }}``.
``{{ ts }}`` str | Same as ``{{ dag_run.logical_date | ts }}``.
| Example: ``2018-01-01T00:00:00+00:00``.
``{{ ts_nodash_with_tz }}`` str | Same as ``{{ dag_run.logical_date | ts_nodash_with_tz }}``.
| Example: ``20180101T000000+0000``.
``{{ ts_nodash }}`` str | Same as ``{{ dag_run.logical_date | ts_nodash }}``.
| Example: ``20180101T000000``.
``{{ prev_data_interval_start_success }}`` `pendulum.DateTime`_ | Start of the data interval of the prior successful :class:`~airflow.models.dagrun.DagRun`.
| ``None`` | Added in version 2.2.
``{{ prev_data_interval_end_success }}`` `pendulum.DateTime`_ | End of the data interval of the prior successful :class:`~airflow.models.dagrun.DagRun`.
| ``None`` | Added in version 2.2.
``{{ prev_start_date_success }}`` `pendulum.DateTime`_ Start date from prior successful :class:`~airflow.models.dagrun.DagRun` (if available).
| ``None``
``{{ dag }}`` DAG The currently running :class:`~airflow.models.dag.DAG`. You can read more about DAGs in :doc:`DAGs <core-concepts/dags>`.
``{{ task }}`` BaseOperator | The currently running :class:`~airflow.models.baseoperator.BaseOperator`. You can read more about Tasks in :doc:`core-concepts/operators`
``{{ macros }}`` | A reference to the macros package. See Macros_ below.
``{{ task_instance }}`` TaskInstance The currently running :class:`~airflow.models.taskinstance.TaskInstance`.
``{{ ti }}`` TaskInstance Same as ``{{ task_instance }}``.
``{{ params }}`` dict[str, Any] | The user-defined params. This can be overridden by the mapping
| passed to ``trigger_dag -c`` if ``dag_run_conf_overrides_params``
| is enabled in ``airflow.cfg``.
``{{ var.value }}`` Airflow variables. See `Airflow Variables in Templates`_ below.
``{{ var.json }}`` Airflow variables. See `Airflow Variables in Templates`_ below.
``{{ conn }}`` Airflow connections. See `Airflow Connections in Templates`_ below.
``{{ task_instance_key_str }}`` str | A unique, human-readable key to the task instance. The format is
| ``{dag_id}__{task_id}__{ds_nodash}``.
``{{ conf }}`` AirflowConfigParser | The full configuration object representing the content of your
| ``airflow.cfg``. See :mod:`airflow.configuration.conf`.
``{{ run_id }}`` str The currently running :class:`~airflow.models.dagrun.DagRun` run ID.
``{{ dag_run }}`` DagRun The currently running :class:`~airflow.models.dagrun.DagRun`.
``{{ test_mode }}`` bool Whether the task instance was run by the ``airflow test`` CLI.
``{{ expanded_ti_count }}`` int | ``None`` | Number of task instances that a mapped task was expanded into. If
| the current task is not mapped, this should be ``None``.
| Added in version 2.5.
``{{ triggering_dataset_events }}`` dict[str, | If in a Dataset Scheduled DAG, a map of Dataset URI to a list of triggering :class:`~airflow.models.dataset.DatasetEvent`
list[DatasetEvent]] | (there may be more than one, if there are multiple Datasets with different frequencies).
| Read more here :doc:`Datasets <authoring-and-scheduling/datasets>`.
| Added in version 2.4.
=========================================== ===================== ===================================================================
.. note::
The DAG run's logical date, and values derived from it, such as ``ds`` and
``ts``, **should not** be considered unique in a DAG. Use ``run_id`` instead.
Accessing Airflow context variables from TaskFlow tasks
-------------------------------------------------------
While ``@task`` decorated tasks don't support rendering jinja templates passed as arguments,
all of the variables listed above can be accessed directly from tasks. The following code block
is an example of accessing a ``task_instance`` object from its task:
.. include:: ../shared/template-examples/taskflow.rst
Deprecated variables
-------------------------------------------------------
The following variables are deprecated. They are kept for backward compatibility, but you should convert
existing code to use other variables instead.
===================================== ==========================================================================
Deprecated Variable Description
===================================== ==========================================================================
``{{ execution_date }}`` the execution date (logical date), same as ``logical_date``
``{{ next_execution_date }}`` the logical date of the next scheduled run (if applicable);
you may be able to use ``data_interval_end`` instead
``{{ next_ds }}`` the next execution date as ``YYYY-MM-DD`` if exists, else ``None``
``{{ next_ds_nodash }}`` the next execution date as ``YYYYMMDD`` if exists, else ``None``
``{{ prev_execution_date }}`` the logical date of the previous scheduled run (if applicable)
``{{ prev_ds }}`` the previous execution date as ``YYYY-MM-DD`` if exists, else ``None``
``{{ prev_ds_nodash }}`` the previous execution date as ``YYYYMMDD`` if exists, else ``None``
``{{ yesterday_ds }}`` the day before the execution date as ``YYYY-MM-DD``
``{{ yesterday_ds_nodash }}`` the day before the execution date as ``YYYYMMDD``
``{{ tomorrow_ds }}`` the day after the execution date as ``YYYY-MM-DD``
``{{ tomorrow_ds_nodash }}`` the day after the execution date as ``YYYYMMDD``
``{{ prev_execution_date_success }}`` execution date from prior successful DAG run;
you may be able to use ``prev_data_interval_start_success``instead if
the timetable/schedule you use for the DAG defines ``data_interval_start``
compatible with the legacy ``execution_date``.
===================================== ==========================================================================
Note that you can access the object's attributes and methods with simple
dot notation. Here are some examples of what is possible:
``{{ task.owner }}``, ``{{ task.task_id }}``, ``{{ ti.hostname }}``, ...
Refer to the models documentation for more information on the objects'
attributes and methods.
Airflow Variables in Templates
------------------------------
The ``var`` template variable allows you to access Airflow Variables.
You can access them as either plain-text or JSON. If you use JSON, you are
also able to walk nested structures, such as dictionaries like:
``{{ var.json.my_dict_var.key1 }}``.
It is also possible to fetch a variable by string if needed (for example your variable key contains dots) with
``{{ var.value.get('my.var', 'fallback') }}`` or
``{{ var.json.get('my.dict.var', {'key1': 'val1'}) }}``. Defaults can be
supplied in case the variable does not exist.
Airflow Connections in Templates
---------------------------------
Similarly, Airflow Connections data can be accessed via the ``conn`` template variable. For example, you could use expressions in your templates like ``{{ conn.my_conn_id.login }}``,
``{{ conn.my_conn_id.password }}``, etc.
Just like with ``var`` it's possible to fetch a connection by string (e.g. ``{{ conn.get('my_conn_id_'+index).host }}``
) or provide defaults (e.g ``{{ conn.get('my_conn_id', {"host": "host1", "login": "user1"}).host }}``).
Additionally, the ``extras`` field of a connection can be fetched as a Python Dictionary with the ``extra_dejson`` field, e.g.
``conn.my_aws_conn_id.extra_dejson.region_name`` would fetch ``region_name`` out of ``extras``.
This way, defaults in ``extras`` can be provided as well (e.g. ``{{ conn.my_aws_conn_id.extra_dejson.get('region_name', 'Europe (Frankfurt)') }}``).
Filters
-------
Airflow defines some Jinja filters that can be used to format values.
For example, using ``{{ logical_date | ds }}`` will output the logical_date in the ``YYYY-MM-DD`` format.
===================== ============ ==================================================================
Filter Operates on Description
===================== ============ ==================================================================
``ds`` datetime Format the datetime as ``YYYY-MM-DD``
``ds_nodash`` datetime Format the datetime as ``YYYYMMDD``
``ts`` datetime Same as ``.isoformat()``, Example: ``2018-01-01T00:00:00+00:00``
``ts_nodash`` datetime Same as ``ts`` filter without ``-``, ``:`` or TimeZone info.
Example: ``20180101T000000``
``ts_nodash_with_tz`` datetime As ``ts`` filter without ``-`` or ``:``. Example
``20180101T000000+0000``
===================== ============ ==================================================================
.. _templates:macros:
Macros
------
Macros are a way to expose objects to your templates and live under the
``macros`` namespace in your templates.
A few commonly used libraries and methods are made available.
================================= ==============================================
Variable Description
================================= ==============================================
``macros.datetime`` The standard lib's :class:`datetime.datetime`
``macros.timedelta`` The standard lib's :class:`datetime.timedelta`
``macros.dateutil`` A reference to the ``dateutil`` package
``macros.time`` The standard lib's :mod:`time`
``macros.uuid`` The standard lib's :mod:`uuid`
``macros.random`` The standard lib's :class:`random.random`
================================= ==============================================
Some airflow specific macros are also defined:
.. automodule:: airflow.macros
:members:
.. _pendulum.DateTime: https://pendulum.eustace.io/docs/#introduction