10

私は元々、App Engineサイトに示されている例を使用してAppEngineにJinja2を実装しました:https ://developers.google.com/appengine/docs/python/gettingstartedpython27/templatesここでjinja2は直接インポートされます:

import jinja2
import os

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

class MainPage(webapp2.RequestHandler):
    def get(self):
        greetings = 'somestring'
        template_values = {
            'greetings': greetings,
        }
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))

しかし、私は現在、ニック・ジョンソンがここで説明した実装に従うSimpleauth(https://github.com/crhym3/simpleauth )を利用しています:http: //blog.notdot.net/2011/11/Migrating-to-Python -2-7-part-2- Jinja2がwebapp2_extrasからインポートされるWebapp-and-templates:

import os
import webapp2
from webapp2_extras import jinja2

class BaseHandler(webapp2.RequestHandler):
  @webapp2.cached_property
  def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

  def render_template(self, filename, **template_args):
        self.response.write(self.jinja2.render_template(filename, **template_args))

class IndexHandler(BaseHandler):
  def get(self):
    self.render_template('index.html', name=self.request.get('name'))

jinja2を使用するための好ましい方法はどれですか?(彼らはうまく一緒に遊んでいないようで、最良のオプションで標準化することを好みます。)

4

4 に答える 4

4

同じ質問がありましたが、ここでの答えは私を満足させません。

カプセル化とパフォーマンスの関係だと思います。小さなアプリケーションの場合、グローバルで問題はありません。したがって、最初の解決策は問題ありません。フレームワークの詳細を学習するためのオーバーヘッドなしで、簡単な方法で簡単な問題を解決できます。

より大きなアプリケーションの場合は、オブジェクトをカプセル化して順序付けすることをお勧めします。基本的に、スケーラビリティのためのインフラストラクチャであるフレームワークを作成します。しかし、それはwebapp2があなたに与えることになっているものです。

その背後にある基本的な問題:ロジックの一部としてインスタンス化されて解放されるクラス(公式例のwebapp2.RequestHandlerクラスなど)に対してローカルのシングルトンタイプのオブジェクトを作成する場合、その参照オブジェクト(jinja2)は次のようになります。最後のクラスインスタンスがなくなったときにリリースされます...多くの解放と再割り当てが行われる可能性があります。したがって、他の場所で参照されていなくても削除されないように、どこかにオブジェクト(webapp2.registry)へのリンクがあると便利です。これはグローバルに似ていますが、グローバル名前空間を汚染することなく、webapp2.get_app()。registryを介してどこからでもアクセスできます。キャッシングも行っています。次に、cached_propertyを使用して、キャッシュのもう1つのレイヤーを実行します。

つまり、カプセル化する場合は、アプリのキャッシュを追加して効率を維持することをお勧めします

この場合、webapp2_extra jinja2にアクセスし、すべてのモジュールで次のコマンドを使用して同じjinja環境にアクセスできます。

jinja2.get_jinja2().environment
于 2013-03-27T12:19:40.890 に答える
3

それらはほとんど同じだと思います。さらにwebapp2_extras.jinja2が行うことは、jinja2.Environment()の初期化を(リクエスト期間中)キャッシュすることです。さらに、webapp2のconfig/registryシステムを活用できます。

get_jinja2 ()ソースを見ると、デフォルトの環境引数と有効な拡張機能(i18nなど)を備えたjinja2.Environment()の便利なラッパーであることがわかります。

于 2012-10-23T08:11:17.303 に答える
1

最初の方法は非常に基本的な例です。

2番目(BaseHandlerを使用)が推奨されるメソッドです。ここにwebapp2共有メソッドを配置します。これらのメソッドは派生クラスで使用でき、ここにディスパッチのようにオーバーライドするwebapp2メソッドを配置します。

于 2012-10-23T01:32:39.053 に答える
1

TL; DR:オプション#2を使用

i18nを使用しない場合は、それほど重要ではありません。しかし、現実の世界では、人々は英語とは異なる言語を話します。GAEのjinja2 i18nにはトリッキーな問題があります。スレッド(つまりthreadsafe: true、app.yaml)はデフォルトでオンになっており、パフォーマンスにとって重要ですが、ほとんどのjinja2i18nドキュメントを見つけることができます。 Web上ではスレッドセーフではありません。ロケールを各jinja2マクロに明示的に渡したくないので、スレッドローカル変数に保持する必要があります。これがwebapp2_extras.jinja2正しく機能します。

于 2018-05-16T11:28:49.853 に答える