ホームページ  >  記事  >  バックエンド開発  >  Python の Flask フレームワークの標準テンプレート エンジンである Jinja2 の使用に関するチュートリアル

Python の Flask フレームワークの標準テンプレート エンジンである Jinja2 の使用に関するチュートリアル

WBOY
WBOYオリジナル
2016-08-04 08:55:461524ブラウズ

Jinja2 には Python 2.4 以降が必要です。
インストール
Jinja をフォローするにはさまざまな方法があり、ニーズに応じてさまざまなフォロー方法を選択できます。
easy_install または pip を使用します:

リーリー
これら 2 つのツールは、Web サイトから Jinja を自動的にダウンロードし、Python ディレクトリの site-packages ディレクトリにインストールします。
tarball からインストール:
リーリー

基本的なAPIの使用法
Jinja でテンプレートを作成する最も簡単な方法は、Template を使用することです。ただし、この使用法は実際のアプリケーションでは推奨されません。

リーリー
この例では、テンプレート コンテンツとして文字列を使用して Template インスタンスを作成し、パラメータとして「name='World'」を指定して「render メソッド」を呼び出し、コンテンツ内の 'name' を「World」に置き換えて、最後にレンダリングされた文字列 - 「u'Hello World!」

区切り文字には 2 種類あります。 {% raw %}{% ... %}{% endraw %} および {% raw %}{{ ... }}{% endraw %}。前者は for ループや代入などのステートメントを実行するために使用され、後者は式の結果をテンプレートに出力するために使用されます。

テンプレートを整理する方法
それでは、テンプレートはどのようにアプリケーションに適合するのでしょうか? Flask に注目している方は、Flask が非常に柔軟で、コンテンツに特別な制限を課していないことに気づいたかもしれません。テンプレートも例外ではありません。また、通常は、何かを配置するための推奨される場所 (テンプレートなど) があることに気づくかもしれません。テンプレートの場合、その場所はパッケージ ディレクトリ内にあります。

リーリー
テンプレート ディレクトリの構造はルーティング構造と平行しています。ルート myapp.com/admin/analytics の場合、テンプレートは templates/admin/analytics.html です。ディレクトリには、直接レンダリングされない追加のテンプレートがいくつかあります。 layout.html ファイルは、他のテンプレートを継承するためのものです。

継承
バットマンのバックストーリーと同様に、よく整理されたテンプレート ディレクトリは継承に大きく依存しています。親テンプレートは通常、すべての子テンプレートが継承できる共通の構造を定義します。この例では、layout.html が親テンプレートで、他の .html ファイルが子テンプレートです。
通常、アプリケーションと Web サイトのあらゆる部分の一般的なレイアウトを定義するトップレベルのlayout.htmlがあります。上記のディレクトリを見ると、トップレベルの myapp/templates/layout.html に加えて、myapp/templates/profile/layout.html および myapp/templates/admin/layout.html が表示されます。最後の 2 つのファイルは、最初のファイルを継承して変更します。

リーリー
子テンプレートでは、親テンプレートを拡張し、これらのブロックのコンテンツを定義できます。


リーリー
super() 関数を使用すると、親ブロックのコンテンツをレンダリングできます。


マクロを作成する
繰り返し発生するコード スニペットをマクロに抽象化することで、テンプレートで DRY (Don'tRepeat Yourself) 原則を遵守できます。アプリケーションでナビゲーション用の HTML を操作している場合は、「アクティブ」リンクにクラス (class="active") を与える必要があります。マクロがなければ、各リンクをチェックしてアクティブなリンクを見つけるための if ... else ステートメントを大量に作成する必要があります。
マクロはコードをモジュール化する方法を提供し、関数のように機能します。マクロを使用してアクティブなリンクをマークする方法を見てみましょう。

リーリー
このテンプレートで今行う必要があるのは、未定義マクロ nav_link を呼び出し、それに 2 つのパラメーター (ターゲット エンドポイント (ターゲット ビューの関数名など) と表示するテキスト) を渡すことだけです。

import ステートメントでコンテキストを指定していることに気づくかもしれません。 Jinja のコンテキストは、Python コードから render_template() 関数と Jinja 環境コンテキストに渡されるパラメータで構成されます。テンプレートの場合、これらの変数はテンプレートのレンダリング時に使用できます。
render_template("index.html", color="red") などの一部の変数は明らかに私たちによって渡されますが、Flask によってコンテキストに自動的に組み込まれる変数や関数もいくつかあります。 gとセッション。 {% raw %}{% from ... import ... with context %}{% endraw %} と言うと、これらの変数がマクロでも使用できることを Jinja に伝えます。
次に、テンプレートで使用される nav_link マクロを定義します。

リーリー
これで、myapp/templates/macros.html にマクロが定義されました。このマクロでは、Flask のリクエスト オブジェクト (Jinja コンテキストでデフォルトで利用可能) を使用して、nav_link で渡されたルートのエンドポイントが現在のリクエストであるかどうかを確認します。そうであれば、現在のページにいるので、そのページをアクティブとしてマークします。

import y from x ステートメントは、x への相対パスを受け取ります。テンプレートが myapp/templates/user/blog.html の場合、「../macros.html」からを使用して nav_link をインポートできます。

自定义过滤器
Jinja 过滤器是一个函数,它能够在 {% raw %}{{ ... }}{% endraw %} 中用于处理一个表达式的结果。在表达式结果输出到模板之前它就被调用。

<h2>{{ article.title|title }}</h2>

在这段代码中,title 过滤器接收 article.title 作为参数并且返回一个过滤后的标题,接着过滤后的标题将会输出到模板中。这就像 UNIX 的“管道化”一个程序到另一个程序的输出。
有很多像 title 一样的内置过滤器。请参阅 Jinja 文档中的 完整列表。
我们可以在我们的 Jinja 模板中定义自己的过滤器供使用。举例来说,我们将会实现一个简单 caps 过滤器用来大写一个字符串中所有的字母。
Jinja 已经有一个 upper 过滤器来做这样的事情,并且还有一个 capitalize 过滤器,它能用来大写第一个字母,小写其余的字母。这些也能处理 unicode 转换,但是我们会继续我们的示例,让大家目前能够知道如何自定义过滤器。
我们要在 myapp/util/filters.py 中定义我们的过滤器。这里给出一个 util 包,它里面有各种各样的模块。

# myapp/util/filters.py
from .. import app
@app.template_filter()
def caps(text):
  """Convert a string to all caps."""
  return text.uppercase()

在这段代码中我们使用 @app.template_filter() 装饰器注册我们的函数成一个 Jinja 过滤器。默认的过滤器名称就是函数的名称,但是你可以传入一个参数到装饰器中来改变它。

@app.template_filter('make_caps')
def caps(text):
  """Convert a string to all caps."""
  return text.uppercase()

现在我们可以在模板中调用 make_caps 而不是 {% raw %}caps:{{ "hello world!"|make_caps }}{% endraw %}。
为了要让我们的过滤器在模板中可用的话,我们只需要在我们的顶层 \\_init.py\\_ 的中导入它。

# myapp/__init__.py
# Make sure app has been initialized first to prevent circular imports.
from .util import filters

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。