【问题标题】:Jinja2 Environment ImportError in Django 1.10 with Python 3.5Django 1.10 和 Python 3.5 中的 Jinja2 环境 ImportError
【发布时间】:2026-02-11 13:20:09
【问题描述】:

我有一个 Django 1.10 项目(使用 Python 3.5 和用于模板的 Jinja2 2.8)设置如下:

*将红色标记视为mysite

文件jinja2.py 定义了这个:

from __future__ import absolute_import

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    return env

这个文件在settings.py 中被调用是这样的:

{
    'BACKEND': 'django.template.backends.jinja2.Jinja2',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'environment': 'mysite.jinja2.environment',
    },
},

但是当我运行服务器并访问带有调用 Jinja2 模板的视图的 URL 时,我收到以下错误:

我花了几个小时在互联网上寻找解决方案,但无法解决。

整个设置是按照官方 Django 文档完成的:https://docs.djangoproject.com/en/1.10/topics/templates/#django.template.backends.jinja2.Jinja2

感谢您的回复

【问题讨论】:

  • 您使用的是哪个版本的 jinja?还要尝试删除 from __future__ import absolute_import 行,因为它仅适用于 Python 2。
  • 这是 Jinja2 2.8。我现在已经在原帖中编辑并提到了这一点。谢谢! __future__ import 只是为了向后兼容;我尝试删除它,但仍然是同样的错误。
  • 你确定应该是'environment': 'mysite.jinja2.environment',而不是'environment': 'jinja2.environment',吗?
  • 是的,我确定,因为我已经在项目根目录的jinja2.py 中定义了它。

标签: python django


【解决方案1】:

我认为您将jinja2.py 放在了错误的位置。它应该在目录mysite/

这是我的django项目mysite(Jin2是app dir)的目录结构,可以正常运行:

➜ /tmp/jinja/mysite $ tree . -I '*.pyc'
.
├── db.sqlite3
├── jin2
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── jinja2
│   │   └── index.html
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   ├── models.py
│   ├── __pycache__
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── jinja2.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── __pycache__

我的settings.pyjinja2.py 和你的一样。唯一的区别是我将jinja2.py 放在了 mysite 目录中。

你应该删除jinja2.py中的from __future__ import absolute_import,它只在python2中需要。

【讨论】:

  • 完美!这解决了这个问题。另一件事,如果你知道的话,你已经将你的jinja2 目录放在了一个应用程序中,它可能工作正常。但是我需要添加一些项目范围的模板,所以你可以在项目级别的jinja2 目录中看到base.html,它对我不起作用。错误现在显示TemplateDoesNotExist。这是否可行,因为文档说如果我们设置APP_DIRS = True,则无需定义DIRS
  • 我通过设置'DIRS': [ os.path.join(BASE_DIR, 'jinja2'), ], 解决了这个问题。如果有更好的方法可以让我知道吗?
  • 哦,对不起。如果您需要一些项目范围的模板。我也只知道设置DIRS 选项。
【解决方案2】:

您已将自己的文件称为jinja2。因此,当您执行import jinja2 时,Python 会发现它而不是实际的 Jinja2 库。

将您的文件称为其他名称。

【讨论】:

  • 我将 jinja2.py 文件的名称更改为 jin.py 并更新了调用它的设置文件。但现在我得到一个不同的错误No module named 'mysite.jin'
  • environment的导入路径为mysite.jinja2.environment,即在mysite的子模块jinjia2中找到environment。所以可以命名为jinja2
  • 是的,它适用于名称jinja2.py,只是文件的位置不正确。