让Django模板在错误发生时快速失败
项目描述
# django-pedant
使Django模板在多种错误情况下快速失败。
<img src="vote_pedant.jpg" alt="此图片略微偏心。"/>
<br><sub>来源:[Flickr:karen_od](https://www.flickr.com/photos/karen_od/33199)</sub>
这种情况我们都遇到过。我们在上下文中忘记了一个模板变量,或者
在模板中访问的一个属性有错误。Django,一个历经战斗的Web
框架,旨在**无论如何都要提供服务网页**,这令许多
Web开发人员感到沮丧,他们发现易于修复的错误几个月都没有得到修复
。这是最糟糕的。这实际上就像被背后刺了一刀,然后任其
流血,用最后一口气说着“Et tu, Django?”。*真的.*这
真是太糟糕了。
这就是django-pedant的由来,这是严格模板渲染器的朋友。
## 这个包为什么这么严格?
我想你是在问“这个包为什么这么严格?”说真的,Django
在以下方面非常宽容
- 在计算 `{% if expression %}` 表达式或其他内置标签时引发的异常。
通常,自定义标签中的错误允许传播。
- `{{ context_variable }}` 表达式中的 `KeyError` 和 `AttributeError`。
- 在某些地方捕获 `UnicodeDecodeError` 并替换为 `''`(待办事项)
- 在评估 `{{ expr|filter }}` 表达式时,`FilterExpression.resolve` 有
`ignore_failures=True`在某些情况下,会吞没`VariableDoesNotExist`错误。
## 用法
要装饰可能隐藏模板错误的视图,只需这样做
```python
from pedant.decorators import fail_on_template_errors
@fail_on_template_errors
def my_view(request)
# [...]
return render_to_string('foo.html')
```
如果`foo.html`中存在错误,视图将现在引发`PedanticTemplateRenderingError`
如果渲染模板时Django吞没了任何错误。
要简单地对模板错误进行*记录*,可以使用`log_on_template_errors`装饰器
```python
import logging
from pedant.decorators import log_on_template_errors
logger = logging.getLogger('myapp.views')
@log_on_template_errors(logger, log_level=logging.INFO)
def my_view(request)
# [...]
return render_to_string('foo.html')
```
这将在`INFO`级别将模板错误记录到`myapp.views`记录器。默认日志级别
是`logging.ERROR`。
要在视图测试中使用严格的渲染,您只需从`PedanticTestCase`继承即可
```python
from django.template import Template, Context
from pedant.utils import PedanticTestCase
class TestBuggyTemplate(PedanticTestCase)
def test(self)
Template('{{ foo }}').render(Context({'bar': 'baz'}))
```
该测试将失败,因为模板中未定义`foo`。`PedanticTestCase`从
标准的Django `TestCase`继承。还提供了`PedanticTestCaseMixin`,如果您不想
承担Django测试用例的事务开销(例如,对于单元测试)。
## 测试
```sh
$ tox
```
使Django模板在多种错误情况下快速失败。
<img src="vote_pedant.jpg" alt="此图片略微偏心。"/>
<br><sub>来源:[Flickr:karen_od](https://www.flickr.com/photos/karen_od/33199)</sub>
这种情况我们都遇到过。我们在上下文中忘记了一个模板变量,或者
在模板中访问的一个属性有错误。Django,一个历经战斗的Web
框架,旨在**无论如何都要提供服务网页**,这令许多
Web开发人员感到沮丧,他们发现易于修复的错误几个月都没有得到修复
。这是最糟糕的。这实际上就像被背后刺了一刀,然后任其
流血,用最后一口气说着“Et tu, Django?”。*真的.*这
真是太糟糕了。
这就是django-pedant的由来,这是严格模板渲染器的朋友。
## 这个包为什么这么严格?
我想你是在问“这个包为什么这么严格?”说真的,Django
在以下方面非常宽容
- 在计算 `{% if expression %}` 表达式或其他内置标签时引发的异常。
通常,自定义标签中的错误允许传播。
- `{{ context_variable }}` 表达式中的 `KeyError` 和 `AttributeError`。
- 在某些地方捕获 `UnicodeDecodeError` 并替换为 `''`(待办事项)
- 在评估 `{{ expr|filter }}` 表达式时,`FilterExpression.resolve` 有
`ignore_failures=True`在某些情况下,会吞没`VariableDoesNotExist`错误。
## 用法
要装饰可能隐藏模板错误的视图,只需这样做
```python
from pedant.decorators import fail_on_template_errors
@fail_on_template_errors
def my_view(request)
# [...]
return render_to_string('foo.html')
```
如果`foo.html`中存在错误,视图将现在引发`PedanticTemplateRenderingError`
如果渲染模板时Django吞没了任何错误。
要简单地对模板错误进行*记录*,可以使用`log_on_template_errors`装饰器
```python
import logging
from pedant.decorators import log_on_template_errors
logger = logging.getLogger('myapp.views')
@log_on_template_errors(logger, log_level=logging.INFO)
def my_view(request)
# [...]
return render_to_string('foo.html')
```
这将在`INFO`级别将模板错误记录到`myapp.views`记录器。默认日志级别
是`logging.ERROR`。
要在视图测试中使用严格的渲染,您只需从`PedanticTestCase`继承即可
```python
from django.template import Template, Context
from pedant.utils import PedanticTestCase
class TestBuggyTemplate(PedanticTestCase)
def test(self)
Template('{{ foo }}').render(Context({'bar': 'baz'}))
```
该测试将失败,因为模板中未定义`foo`。`PedanticTestCase`从
标准的Django `TestCase`继承。还提供了`PedanticTestCaseMixin`,如果您不想
承担Django测试用例的事务开销(例如,对于单元测试)。
## 测试
```sh
$ tox
```