【问题标题】:Template Language for Django which does not silently fail on exception?Django的模板语言不会在异常时静默失败?
【发布时间】:2020-07-14 23:24:19
【问题描述】:

我喜欢 django、ORM、管理员和社区。但我不喜欢模板语言中的异常处理,就像这里记录的那样:invalid template variables

是否有替代模板变量,如果出现问题(即使在生产中),我总是会得到异常?

我更喜欢例外而不是“默默地忽略错误”。

【问题讨论】:

  • 它实际上并没有默默地失败,它返回 null 什么都没有,HTML 中没有任何效果
  • 但是是的,您可以按照文档说明使用 jinja2
  • @AhmedI.Elsayed 它我看不到任何东西应该在哪里,那么这对我来说是“默默地失败”。

标签: django django-templates


【解决方案1】:

一种解决方案是将模板后端更改为jinja2(Django“本机”支持)following the documentation

深入解释jinja2 django 后端如何处理undefined 变量问题,can be found here (注解我的)

无效的模板变量

当遇到无效变量时,您可以设置各种行为 在 Jinja 模板中。 Django 为 Jinja 设置了两种默认行为,一种 当DEBUG=True——开发中的常见设置——以及 other for when DEBUG=False -- 生产中的常见设置。

如果DEBUG=True 并且在 Jinja 模板中设置了无效变量, Jinja 使用jinja2.DebugUndefined 类来处理它。这 jinja2.DebugUndefined 类逐字输出变量 渲染(例如,如果模板有 {{foo}} 语句和 上下文中不存在变量,Jinja 输出{{foo}},使得 更容易发现无效变量)。

如果DEBUG=False 并且在 Jinja 模板中设置了无效变量, Jinja 使用jinja2.Undefined 类来处理它。这 jinja2.Undefined 类在 用于渲染的变量(例如,如果模板有 {{bar}} 语句 并且变量在上下文中不存在,Jinja 输出一个空白 空间)。 值得一提的是,最后一个行为与 Django 模板中无效变量的默认行为。

除了jinja2.DebugUndefinedjinja2.Undefined 类之外, Jinja 还支持jinja2.StrictUndefined 类。这 jinja2.StrictUndefined 类用于生成立即错误 而不是继续渲染,这有助于更快 无效变量的诊断。 但是,请注意最后一节课 根据DEBUG 变量更改其行为,它要么生成 带有无效变量名的堆栈错误(即DEBUG=True 时)或 它会生成一个标准的 HTTP 500 错误页面(即当 DEBUG=False 时)。

如果您想在模板上设置StrictUndefined 选项,可以使用以下示例from the same source

清单 4-4。为 Jinja 中的无效变量生成错误 jinja2.StrictUndefined

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))

import jinja2

TEMPLATES = [    
    { 
        'BACKEND':'django.template.backends.jinja2.Jinja2',
        'DIRS': ['%s/jinjatemplates/'% (PROJECT_DIR),],
        'APP_DIRS': True,
        'OPTIONS': {
            'undefined':jinja2.StrictUndefined
        },
    }            
]

如示例 4-4 所示,我们首先声明 import jinja2 以获得 在settings.py 访问 Jinja 的课程。接下来,我们声明 OPTIONS 参数中的未定义键并将其分配给 Jinja 类来处理无效变量。在这种情况下,我们使用 jinja2.StrictUndefined 类在无效模板时得到错误 遇到变量,但您同样可以使用其他任何变量 两个 Jinja 类来处理无效变量(即 jinja2.DebugUndefinedjinja2.Undefined)。

最后,如果您想在 DEBUG=TrueDEBUG=False 之间有不同的行为,您可以在 TEMPLATES 设置中更改以下内容:

'OPTIONS': {
    'undefined': jinja2.DebugUndefined if DEBUG else jinja2.StrictUndefined
},

利用 jinja2 的开发调试选项和生产的严格选项(引发问题中提到的错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 2011-02-07
    • 1970-01-01
    • 2019-08-01
    • 2012-03-28
    • 2011-09-16
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多