【发布时间】:2013-03-31 13:21:29
【问题描述】:
情况
我正在编写一个检查 Django 模板的检查程序。例如,我想检查所有使用 url 模板标签的 Django 模板是否在第一个参数上使用引号,以便它与 Django 1.5 兼容。我还想检查他们是否在模板中包含了{% load url from future %}。
例如,如果我的程序解析以下 Django 模板,我希望它引发异常。
{% extends 'base.html' %}
<td>
<a href="{% url first second %}">
</a>
</td>
但是这个模板应该毫无例外地被解析。
{% 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)
【问题讨论】:
-
我无法回答您的主要问题,但是要让 django 解析模板但不让它返回 http 响应,您可以使用 render_to_string 将编译后的 HTML:docs.djangoproject.com/en/1.5/ref/templates/api/…
-
根据django book,“大部分解析都是通过调用单个正则表达式进行的”。因此,与构建真正的解析器相比,简单地从 Django 源代码中查找并导入或复制 RegEx 可能会更好。
-
另外,你为什么不想使用正则表达式?
-
使用 docs.djangoproject.com/en/1.5/ref/templates/api/… 解析模板并在 django shell 中编译它,然后使用 dir() 在对象上四处寻找,直到找到所需的信息。
-
There 是尝试使用正则表达式完成任务。可能对你有帮助