django-debug-toolbar:'Template'对象没有属性'engine'

时间:2016-07-25 13:58:57

标签: python django templates django-debug-toolbar

我刚尝试在新计算机上运行现有的Django项目,而我在使用django-debug-toolbar时遇到了麻烦。这似乎与Jinja2有关。这是堆栈跟踪:

Traceback:
File "/path/to/myrepo/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  223.                 response = middleware_method(request, response)
File "/path/to/myrepo/env/local/lib/python2.7/site-packages/debug_toolbar/middleware.py" in process_response
  120.                 panel.generate_stats(request, response)
File "/path/to/myrepo/env/local/lib/python2.7/site-packages/debug_toolbar/panels/templates/panel.py" in generate_stats
  175.             context_processors = self.templates[0]['context_processors']
Exception Type: AttributeError at /first/page/
Exception Value: 'Template' object has no attribute 'engine'

我正在使用django-jinja2将Jinja2集成到我的项目中,这之前没有用,但现在似乎期待这个template变量成为普通的Django模板。在我的TEMPLATES设置中,我设置了Jinja2和DjangoTemplates,Jinja2使用特定的扩展名('tmpl')以确保Jinja2只使用这些模板,其他所有模板都可以通过DjangoTemplates后端。

在使用带有Jinja2的django调试工具栏之前,有没有人看到此错误?如果需要,我可以发布更多设置。

编辑:根据要求,这是我的模板设置:

TEMPLATES = [
    {
        #'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'BACKEND': 'django_jinja.backend.Jinja2',
        #'NAME': 'jinja2',
        'DIRS': [
            os.path.join(DEPLOY_PATH, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'debug': DEBUG,
            'match_extension': '.tmpl',
            #'environment': 'jinja2.Environment',
            'extensions': [
                'jinja2.ext.with_',
                'jinja2.ext.i18n',
                'django_jinja.builtins.extensions.UrlsExtension',
                'django_jinja.builtins.extensions.CsrfExtension',
                'pipeline.templatetags.ext.PipelineExtension',
            ],
            'context_processors': [
                "django.contrib.auth.context_processors.auth",
                "django.core.context_processors.debug",
                "django.core.context_processors.i18n",
                "django.core.context_processors.media",
                "django.core.context_processors.static",
                "django.contrib.messages.context_processors.messages",
                "django.core.context_processors.request",
            ]

        },
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(DEPLOY_PATH, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'debug': DEBUG,
            'context_processors': [
                "django.contrib.auth.context_processors.auth",
                "django.core.context_processors.debug",
                "django.core.context_processors.i18n",
                "django.core.context_processors.media",
                "django.core.context_processors.static",
                "django.contrib.messages.context_processors.messages",
                "django.core.context_processors.request",
            ]
        }
    }
]

更新 - 我通过在调试工具栏来源中进行小规模更改来“修复”此问题:更改debug_toolbar/panels/templates/panel.py中的第175行:

template_dirs = self.templates[0]['template'].engine.dirs

为:

if hasattr(self.templates[0]['template'], 'engine'):
    template_dirs = self.templates[0]['template'].engine.dirs
elif hasattr(self.templates[0]['template'], 'backend'):
    template_dirs = self.templates[0]['template'].backend.dirs
else:
    raise RuntimeError("Couldn't find engine or backend for a template: {}",format(self.templates[0]['template']))

我没有研究过为什么会这样(对于某些人来说这个调试工具栏1.5和django-jinja 2.2.0的组合工作正常)但是我注意到Jinja2模板有backend属性和Django模板具有engine属性,并且两者似乎都用于同一事物。

2 个答案:

答案 0 :(得分:2)

我也得到了这个,你可以根据你的建议修复它,而不是通过提供自己的小组类来破解核心:

<强> debug.py

from debug_toolbar.panels.templates import TemplatesPanel as BaseTemplatesPanel

class TemplatesPanel(BaseTemplatesPanel):
    def generate_stats(self, *args):
        template = self.templates[0]['template']
        if not hasattr(template, 'engine') and hasattr(template, 'backend'):
            template.engine = template.backend
        return super().generate_stats(*args)

<强> settings.py

DEBUG_TOOLBAR_PANELS = [
    'debug_toolbar.panels.versions.VersionsPanel',
    'debug_toolbar.panels.timer.TimerPanel',
    'debug_toolbar.panels.settings.SettingsPanel',
    'debug_toolbar.panels.headers.HeadersPanel',
    'debug_toolbar.panels.request.RequestPanel',
    'debug_toolbar.panels.sql.SQLPanel',
    'debug_toolbar.panels.staticfiles.StaticFilesPanel',
    'myapp.debug.TemplatesPanel', # original broken by django-jinja, remove this whole block later
    'debug_toolbar.panels.cache.CachePanel',
    'debug_toolbar.panels.signals.SignalsPanel',
    'debug_toolbar.panels.logging.LoggingPanel',
    'debug_toolbar.panels.redirects.RedirectsPanel',
]

答案 1 :(得分:0)

self.template可能是空的,我认为这是由于缓存...无论如何, 需要更换:

template = self.templates[0]['template']

template = None
try:
    template = self.templates[0]['template']
except IndexError:
    pass