2011-11-21 11 views
8

私はDjangoのテンプレートエンジンについてもっと知りたいと思っています。それはいつも私にとってブラックボックスのように思えます。 は、関連する一般的なステップの概要を示し、テンプレートが読み込まれて解析され、コンテキストでレンダリング(カスケードで表示)され、結果を得るために一緒に追加されるノードのツリーを作成します。djangoテンプレートはどのように解析されますか?

私が理解していないのは、解析する方法と、どの基準でノードが作成されるかです。解析後に特定のノードを構成するものは、カスタムテンプレートタグの作成にどのように影響しますか(つまり、ノードが少なくなるようなテンプレートタグを書く方が効率的です)。

+0

私は 'django.template.base'を読み始めましたが、強力な時間撓曲魔法(goto 5amのように)を感じるとすぐに出ました。私はupvoteし、代わりに朝のチェック:) –

+0

私は私のtodoリストに入れました! –

答えて

2

最初に見なければならないのは、最初にdjango/template/base.pyを付けたcode.djangoproject.com であると思います。または、ソースをダウンロードし、お気に入りのエディタやIDEで見てください。

3

プロセスの詳細を理解する方法の1つは、werkzeug debuggerでdjangoを実行し、テンプレートで例外をトリガすることです。そうすれば、その時点までスタック全体を表示(および対話)することができます。

0

私はdiscribeするための簡単な方法があり、彼らはトークン化を使用して推測して

を解析:

トークン化:これは

で構成されてい

integer foo = "bar" + 15; 

: ブレークのようなタイプにコードをアパート

T_VARIABLETYPE + T_VARIABLENAME + T_EQUALS + T_STRING + T_PLUS + T_DIGIT + T_SEMI 

この後、tryinによって解析できますパターンを見つける

T_VARIABLETYPE + T_VARIABLENAME + T_EQUALS + {A recursive thing} + T_SEMI 

あなたはこれを試したい場合は私がお勧めできコマンド

を実行することができるこの方法をパーサ

解析してパターンを見つけるグラム"ANTLR"を使用するhttp://www.antlr.org/ JavaやC#、さらにPHPやJSのような多くの言語で利用可能です。

3

すべてのタグからノードが作成されます。 how to write custom tagsを読んで、その仕組みを知ることができます。タグの中にあるものはすべてその子になります。ここではDjangoのドキュメントからのコメントタグの例は次のとおりです。

def do_comment(parser, token): 
    nodelist = parser.parse(('endcomment',)) 
    parser.delete_first_token() 
    return CommentNode() 

あなたはコメントタグは「endcomment」まですべてを解析し、それを捨てるだろう見るように。他のタグはnodelistからSometagNode()に渡され、レンダリングに使用されます。

再帰的にレンダリングされます。レンダリング()がノード上で呼び出されると、レンダリングはその子にレンダリングされます。

解析では、ネストされたタグを取得することができますし、それがタグにパースとつまずくないとき、それは順番に呼び出します。これは、do_tag()事を呼び出すためparser.parse()は、タグを閉じて、適切なマッチングを見つけるために管理します、なぜこれがあるだけでなく再帰的に行われていますparser.parse()はもう一度最も近い終了タグを見つけ、すべてをノードにラップしてノードを返します。上位のparser.parse()はそれをノードリストに置き、終了タグを検索し続けます。

ノードのコンテキストオブジェクトは、dicts構造のリストの一種です。余分なコンテキストは既存のコンテキストの上にプッシュされ、子ノードに渡され、ノードがレンダリングされた後にポップアウトされるため、上位スコープに影響しません。

子を持たないタグの場合、parser.parse()は使用されないため、ノードインスタンスは子なしで返されます。

関連する問題