View All Posts. MiCHiLU.com powered by Django ;-)

[Django]: Django和訳ドキュメント sync to r5492

Django オンラインドキュメント和訳 更新しました。 Revision 5492 (2007/06/19). 「Django でのユーザ認証 - マネジャ関数」「テンプレートタグの概要 - iter_render()」「レンダリング速度を向上させるには」についての記述が更新されています。

以下、 diff -r 5468:5492 の主な変更分です。

マネジャ関数

  • make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789') 指定した長さのランダムなパスワードを生成して返します.パスワードに使 える文字は文字列で指定します.(allowed_chars のデフォルト値は,ユー ザの見間違いを防ぐため i, I, l, o, 1, 0 を除 いてあります.)

テンプレートタグの概要

テンプレートをコンパイルする時,Django は元のテンプレートテキストを「ノード (node)」に分割します.各ノードは django.template.Node のインスタンスで あり, render() または iter_render() メソッドを持ちます.コンパイル 済みのテンプレートは単なる Node オブジェクトの集まりに過ぎません.コン パイル済みのテンプレートオブジェクトに対して render() を呼び出すと,テ ンプレートは指定されたコンテキストを使ってノードリストの各 Node に対し て render() を呼び出します.戻り値は全て連結され,テンプレートからの出 力になります.

従って,カスタムテンプレートタグを定義するには,元のテンプレートタグをどう やって Node (コンパイル関数: compilation function) に変換し,個々のノー ドの render() メソッドや iter_render() メソッドが何をするかを指定す る必要があります.

レンダリング速度を向上させるには

新しいタグを実装する場合,たいていの実用的な目的なら Noderender() メソッドを持たせるのが簡単で十分な方法です.とはいえ, 巨大な文字列が生成されるようなテンプレートタグを作りたい場合, render() の代わりに iter_render() メソッドを使って逐次的にレンダリングを行った方 がレンダリング速度を向上でき (かつメモリ消費を抑えられ) ます.

iter_render() メソッドは,部分的な文字列を yield するイテレータか,部分 文字列の配列を返すようなメソッドとして実装します.テンプレートレンダラは, 部分文字列群を結合して,最終的な出力を生成します. render() メソッドに 対する利点は, Node 内の全てのレンダリング結果の入った巨大な文字列を一 度に生成する代わりに,より小さな部分文字列を生成できるということです.

例として,単にファイルの中身を返すような簡単な Node のサブクラスを示し ましょう

class FileNode(Node):
    def __init__(self, filename):
        self.filename = filename

    def iter_render(self):
        for line in file(self.filename):
            yield line

このタグを使えば,巨大なファイルを操作する場合にファイルの全内容をメモリに 読み込む必要がなく,最適化の効果が生じます.

Node サブクラスの iter_render() メソッドを定義する場合, render() メソッドを定義する必要はありません.逆もまた然りです.デフォル トの Node.iter_render() メソッドの実装は,必要に応じて render() を 呼ぶだけの実装になっています.実は,この仕様のおかげでちょっと便利なおまけ があります.というのも,新しいタグを開発するときに,まずデバッグしやすいよ うに全出力を一度に生成するコードを render() に書いて,その後でメソッド をイテレータで書き直し,メソッド名を iter_render() に変えて,同じ出力を 得られるか調べればよいからです.

ただし, Node のサブクラスは render()iter_render()どちらか を実装せねばなりません.どちらのメソッドも省略すると,コードを import した際に TypeError が送出されます.

Tue, 19 Jun 2007 14:38:09 +0900 source edit
Creative Commons License
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.
View All Posts. MiCHiLU.com powered by Django ;-)