情况
我正在编写一个检查 Django 模板的检查程序。例如,我想检查是否所有使用 url
模板标签的 Django 模板,在第一个参数上使用引号,以便它与 Django 1.5 兼容。我还想检查一下他们是否在模板中包含了 {% load url from future %}
。
例如,如果我的程序解析以下 Django 模板,我希望它引发异常。
{% extends 'base.html' %}
<td>
<a href="{% url first second %}">
</a>
</td>
但是这个模板应该毫无异常(exception)地被解析。
{% extends 'base.html' %}
{% load url from future %}
<td>
<a href="{% url 'first' second %}">
</a>
</td>
我并不局限于这个简单的例子。我还有其他解析要做。例如,我想检查模板中有多少 load
模板标签。
问题
如何优雅地解决这个解析问题?
- 我不想使用正则表达式。
- 我这个 Django 在这方面有一些实用程序。我认为使用它们是个好主意,但我不知道怎么做。
- 我想独立于 Django 运行该程序。所以我不希望 Django 自己运行程序(使用
render_to_response
)。 (这很重要)
代码
请告诉我一些可以解决我提到的例子的代码。我想检测 {% load url from future %}
是否在代码中。另外我想检查每个 url
模板标签并检查第一个参数是否被引用。
奖励:
- 我希望能够看到 Django 从该模板生成的呈现的 HTML,并对其进行 HTML 解析。 (例如使用 PyQuery)
最佳答案
你说...
I want to check if all Django templates that use url template tag, use it with quotes on first parameter so that it is Django 1.5 compatible.
...和...
I don't want to use regular expressions.
...因为...
the result of that might become a huge spaghetti code
...但是,坦率地说,从头开始编写解析器可能比使用正则表达式更困惑。我看不出像这样简单的正则表达式有什么乱七八糟的……
"{% *url +[^']"
...而且我怀疑是否存在如此简洁的非基于正则表达式的解决方案。
关于...
Also I want to check that they have included
{% load url from future %}
in their templates.
如果您的目的是确保 Django 1.5 的兼容性,那么这毫无意义。根据Django 1.5 release notes ,新式 url 标记语法默认启用,因此行 {% load url from future %}
不会有任何效果。
在 1.5 之前的版本中,只需将...放在一起就简单多了
import django.template
django.template.add_to_builtins('django.templatetags.future')
...在您的 settings.py
底部并完成它。 :-)
关于python - 如何为模板标签解析 Django 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15896408/