9

状況

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 を使用)
4

3 に答える 3

9

あなたは言う...

URLテンプレートタグを使用するすべてのDjangoテンプレートが最初のパラメーターに引用符を付けて使用して、Django 1.5と互換性があるかどうかを確認したい.

...と...

正規表現は使いたくありません。

...なぜなら...

その結果、巨大なスパゲッティ コードになる可能性があります

...しかし、率直に言って、ゼロからパーサーを作成することは、正規表現を使用するよりもさらに厄介になる可能性があります。次のような単純な正規表現について、何がそれほど厄介なのかわかりません...

"{% *url +[^']"

...そして、それと同じくらい簡潔な非正規表現ベースのソリューションがあるとは思えません。

に関して...

{% 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')

...あなたの一番下で、それで終わりですsettings.py。:-)

于 2013-04-11T18:38:18.533 に答える
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>]

コンパイル文字列メソッドは、Templateクラスによって使用され、ノード リストを生成するために使用されるメソッドです。Django 1.8 Alpha でテスト済み。

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

于 2014-07-05T04:33:46.723 に答える