Skip to content

Fixing "ImportError: cannot import name 'escape' from 'jinja2'"

This ImportError occurs when your code or dependencies try to import the escape function from the jinja2 package, but this functionality has been moved to the markupsafe package in newer versions of Jinja2.

Problem Overview

The error typically appears as:

python
ImportError: cannot import name 'escape' from 'jinja2'

This issue started occurring after Jinja2 version 3.1.0 (released March 24, 2022), where the escape and Markup functions were moved to the markupsafe package as part of a refactoring effort.

Root Cause

Several popular Python packages, particularly older versions of Flask (before 2.0.0), relied on importing escape directly from jinja2. When Jinja2 removed this functionality, it broke compatibility with those older versions.

Solutions

The most straightforward solution is to update Flask to version 2.0.0 or later, as these versions no longer depend on the deprecated import:

txt
Flask>=2.2.2

Update using pip:

sh
pip install --upgrade Flask

WARNING

Note that Flask 1.x.x is no longer supported by the development team, so upgrading is recommended for security and compatibility reasons.

2. Modify Import Statements

If you're directly using escape in your own code, change the import statement:

python
# Instead of:
from jinja2 import escape

# Use:
from markupsafe import escape

This change ensures compatibility with both older and newer versions of Jinja2.

3. Downgrade Jinja2 (Temporary Fix)

If you cannot update your dependencies immediately, you can temporarily downgrade Jinja2:

sh
pip install Jinja2==3.0.3

Or add to your requirements.txt:

txt
jinja2<3.1.0

DANGER

This is not recommended as a long-term solution, as you'll miss security updates and new features in later Jinja2 versions.

4. Specific Case: Fixing nbconvert

If you encounter this error when using Voila or Jupyter nbconvert, you may need to modify the ansi.py file:

  1. Navigate to: site-packages/nbconvert/filters/ansi.py
  2. Change the import from:
    python
    import jinja2
    to:
    python
    from markupsafe import escape
  3. Replace:
    python
    text = jinja2.utils.escape(text)
    with:
    python
    text = escape(text)

Prevention

To avoid similar issues in the future:

  1. Keep your dependencies updated regularly
  2. Use version constraints in your requirements.txt that allow for security patches but prevent breaking changes
  3. Monitor changelogs for major dependencies like Flask and Jinja2

Complete Working Requirements Example

Here's an updated requirements.txt that should work without the import error:

txt
chart_studio==1.1.0
dash==2.1.0
dash_bootstrap_components==1.0.3
dash_core_components==2.0.0
dash_html_components==2.0.0
dash_renderer==1.9.1
dash_table==5.0.0
Flask==2.2.2  # Updated from 1.1.2
matplotlib==3.4.3
numpy==1.20.3
pandas==1.3.4
plotly==5.5.0
PyYAML==6.0
scikit_learn==1.0.2
scipy==1.7.1
seaborn==0.11.2
statsmodels==0.12.2
urllib3==1.26.7

The key change is updating Flask from version 1.1.2 to 2.2.2 or later, which resolves the incompatible import.