1

++++ 下部の解決策を参照 (2 回目の更新) ++++

私は Google App Engine と Python の比較的初心者です。

blob として格納されている jinja2 テンプレート (プログラムで生成されたもの) が多数あります (GAE ではプログラムがファイルに書き込むことができないため)。これらの BLOB テンプレートをレンダリングしたいのですが、render ステートメントでそれらを参照する方法がわかりません。

必要に応じて、これらのテンプレートをブロブストアに保存できるかもしれません。

どんな提案でも大歓迎です。このような render ステートメントがどのように見えるかの例は、スーパーです。

(Django のテンプレートを参照することはおそらく似ているのではないかと思うので、タグに Django を含めました。)

ご協力ありがとうございます。

++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++ ++++ 質問のフォローアップを次のように修正しました変数を jinja2 のテンプレート ソースとして使用しようとしています ++++ +++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ これを TextProperty フィールドで動作させようとしており、次のように簡単なテストを行いました (既にテキスト フィールドを取得していると仮定しています)。

FileTxt = '<html><body><br /><br /><p>The first test value starts here {{val1}}.  And {{val2}} is the 2nd test value.</p></body></html>'
val1 = 'H value 1 H'
val2 = 'H second value H'
self.render_template(FileTxt, {'val1': val1, 'val2': val2})       

これにより、「無効なファイル名」エラーが返されます。

ファイル ...\templates\... を開こうとしていることに気付きました

私は何らかの形で以下を変更する必要があると思います。

TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'templates')
jinja_environment = \
    jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATE_DIR))

これを変更して、ファイルではなく変数のテンプレートで機能するようにするにはどうすればよいですか? または、ファイルのないバージョンを機能させるには、他に何をする必要がありますか?

ありがとう。

++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ 以下は機能しています! お二人ともありがとう!++++ ++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++

class TextFileRender(BaseHandler):
    def get(self):
        val1 = 'H value 1 H'
        val2 = 'H second value H'
        env = jinja2.Environment(loader=jinja2.FunctionLoader(loader))
        self.render_template(env.get_template('y'), {'val1': val1, 'val2': val2})

次に、別の .py ファイルにローダーを追加しました (別のファイルで呼び出してからインポートに追加する関数を常に持たなければならない理由がわかりません)

def loader(x):
    r = '<html><body><br /><br /><p>The first test value starts here {{val1}}.  And {{val2}} is the 2nd test value.</p></body></html>'
    return r

上記は機能しています。しかし、今私の問題は、ある変数の html コンテンツが別の html テンプレート (データストアにも格納されている) を拡張することです。HTML の extends ステートメント ({% extends "master_template.html" %}) を {% extends nv.get_template('master_template') %} のようなものにすることはできますか?

ご協力いただきありがとうございます。

4

3 に答える 3

4

テンプレート データはどちらの場所 (ブロブストア、データストア) にも保存でき、ソリューションは同じです。通常の jinja2 ローダーはFileSystemLoader. FunctionLoaderのようなものを試して、フェッチされたブロブストア (またはデータストア) エントリから値を返す必要があります。

例えば:

def loader(blob_key):
    r = blobstore.BlobReader(blob_key)
    return r.read()

env = jinja2.Environment(loader=jinja2.FunctionLoader(loader))

rendered_template = env.get_template('some blob key').render({'k': 'v'})

もちろん、毎回ブロブストアから取得するのではなく、何らかのキャッシュ (ローカル、memcache) を使用する必要があります。

于 2012-09-19T19:44:01.957 に答える
1

テンプレートの継承に関する質問です。答えは、関数ローダーを実装すると、2 回呼び出されるということです。最初に子用、次に基本テンプレート用です。このためには、ローダーを変更する必要があります。これで、固定の HTML 文字列が読み込まれます。パラメータ x には、テンプレートの名前が含まれています。クリア?ちなみに、ジンジャインクルードを使用すると、関数ローダーも呼び出されます

于 2012-09-20T16:56:30.703 に答える
0

はい、できます。ただし、追加情報を含む HTML テンプレートをデータストアに保存することもできます。content = db.TextProperty() を使用して、この HTML を保存します。

于 2012-09-19T17:35:12.640 に答える