如何解析模板标签的Django模板

Yas*_*uri 9 python django

情况

我正在编写一个检查Django模板的检查器程序.例如,我想检查是否所有使用url模板标签的Django模板,在第一个参数上使用引号,以便它与Django 1.5兼容.此外,我想检查他们是否已包含{% load url from future %}在他们的模板中.

例如,如果我的程序解析以下Django模板,我希望它引发异常.

{% extends 'base.html' %}
<td>
  <a href="{% url first second %}">
  </a>
</td>
Run Code Online (Sandbox Code Playgroud)

但是这个模板应该毫无例外地进行解析.

{% extends 'base.html' %}
{% load url from future %}
<td>
  <a href="{% url 'first' second %}">
  </a>
</td>
Run Code Online (Sandbox Code Playgroud)

我不仅限于这个简单的例子.我还有其他解析方法.例如,我想检查load模板中存在多少个模板标签.

我怎样才能优雅地解决这个解析问题?

  • 我不想使用正则表达式.
  • 我这个Django它自己在这方面有一些实用工具.我认为使用它们是一个好主意,但我不知道如何.
  • 我想与Django分开运行程序.所以我不希望Django自己运行程序(带render_to_response).(这很重要)

请告诉我一些可以解决我提到的例子的代码.我想检测是否{% load url from future %}在代码中.此外,我想检查每个url模板标签,并检查是否引用了第一个参数.

奖金:

  • 我希望能够看到Django从这个模板生成的渲染HTML,并对其进行HTML解析.(例如使用PyQuery)

Aya*_*Aya 9

你说...

我想检查是否所有使用url模板标签的Django模板,在第一个参数上使用引号,以便它与Django 1.5兼容.

...和...

我不想使用正则表达式.

...因为...

结果可能会成为一个巨大的意大利面条代码

...但是,坦率地说,从头开始编写解析器可能比使用正则表达式更麻烦.我不认为正则表达式如此简单,就像......

"{% *url +[^']"
Run Code Online (Sandbox Code Playgroud)

......我怀疑有一种非正则表达式的解决方案就像那样简洁.

关于......

此外,我想检查他们是否已包含 {% load url from future %}在他们的模板中.

如果您的目的是确保Django 1.5兼容性,那么这是毫无意义的.根据Django 1.5发行说明,默认情况下启用了新式url标记语法,因此该行{% load url from future %}不会产生任何影响.

在1.5之前的版本中,只需放置......就简单得多了......

import django.template
django.template.add_to_builtins('django.templatetags.future')
Run Code Online (Sandbox Code Playgroud)

...在你的底部settings.py并完成它.:-)


dav*_*gsu 4

您也可以使用该compile_string方法。

 >>> from django.template.base import *
 >>> settings.configure()
 >>> compile_string("<a href='ab'></a>{% cycle 'row1' 'row2' as rowcolors %}", None)
 >>> [<Text Node: '<a href='ab'></a>'>, <django.template.defaulttags.CycleNode object at 0x10511b210>]
Run Code Online (Sandbox Code Playgroud)

类使用编译字符串方法Template,该方法用于生成节点列表。在 Django 1.8 Alpha 中测试。

https://github.com/django/django/blob/1f8bb95cc2286a882e0f7a4692f77b285d811d11/django/template/base.py