python - 如何为模板标签解析 Django 模板

标签 python django

情况

我正在编写一个检查 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/

相关文章:

python - 在没有 [ ] 括号的情况下将项目附加到列表

Python 3.x 短内存数字猜测(编程/数学)

python - 如何在opencv python中获取视频的前一帧

python - 仅使用 pycharm 的 Django 测试错误 - 不是终端 |应用程序尚未加载

django - Django Rest Framework 中 ViewSet 结果的聚合总数

python virtualenv : why can I still import old modules in clean/new virtualenv

python - cProfile 没有方法运行调用

django - Redis 在内存已满之前驱逐键

python - Django 1.9 中的模型。类型错误 : __init__() got multiple values for argument 'verbose_name'

python - 基于请求对象创建模型实例的方法