(機械翻訳) テンプレート¶
A:term: template`は:term: view`によって提供される動的データをレンダリングするために使用できるディスク上のファイルです。 :app: `Pyramid`は、テンプレートのタスクを実行するためのさまざまな方法を提供し、一連のバインディングパッケージを通じてアドオンのテンプレートサポートを提供します。
組み込みのテンプレートがどのように使われているかについて議論する前に、app: `Pyramid`を一般的にレンダラーの設定で直接レンダリングする2つの方法について説明します。
テンプレートの直接使用¶
:app: Pyramid`の中でテンプレートを使う最も簡単な方法は、:term: view callable`の中で直接レンダリングさせることです。特定のテンプレートエンジンによって提供されるAPIを使用して、そのようにすることができます。
:app: Pyramid`はビューコールバックから直接テンプレートをレンダリングできるようにする様々なAPIを提供します。たとえば、アプリケーションの ` templates``ディレクトリに :foo.pt`という名前の:term: Chameleon`という名前のZPTテンプレートがある場合、以下のようなビューの本体の中からテンプレートをレンダリングすることができますそう:
1 2 3 4 5 6 | from pyramid.renderers import render_to_response
def sample_view(request):
return render_to_response('templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
|
上記の `` sample_view``:term: view callable`関数は、 templates / foo.pt``テンプレートの本体を含む:term: response`オブジェクトを返します。この場合、 `` templates``ディレクトリは、 `` sample_view``関数を含むモジュールと同じディレクトリになければなりません。テンプレート作成者は、置き換えや比較のために `` foo``と `` bar``を最上位の名前として利用できます。
上記の例では、 `` templates / foo.pt``のパスは、ビュー設定を定義するファイルを含むディレクトリからの相対パスです。この場合、これは `` sample_view``関数を定義するファイルを含むディレクトリです。レンダラーパスは通常単純な相対パス名ですが、レンダラーとして指定されたパスは、UNIXではスラッシュ、Windowsではドライブレター接頭辞から始まる絶対パスにすることができます。代わりに、パスは `` some.dotted.package_name:relative / path``形式の:term: `asset specification`でもかまいません。これにより、別のパッケージに格納されているテンプレート資産に対処することができます。例えば:
1 2 3 4 5 6 | from pyramid.renderers import render_to_response
def sample_view(request):
return render_to_response('mypackage:templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
|
資産の指定はPython パッケージ内のファイルを指します。この場合、 `` mypackage``パッケージの `` templates``ディレクトリ内の `` foo.pt``という名前のファイルを指しています。相対的なテンプレート名の代わりにアセット仕様を使用するのは良い考えです。アセット仕様を使用して:func: `〜pyramid.renderers.render_to_response`を呼び出すと、別の場所にコードを移動すると引き続き正しく動作します。
上記の例では、current:app: Pyramid`リクエストを表す request``という名前のキーワード引数を渡します。要求キーワード引数を渡すと、適切なシステム値を構成するために必要な情報の大部分が要求に含まれているため、レンダラーにより正確なシステム値(see:ref: `renderer_system_values)を提供する` render_to_response``関数が発生します。あなたのテンプレートが ` request``または `` context``という名前に依存している場合、またはspecial:term: renderer globals`を設定した場合、すべての呼び出しで request``をキーワード引数として渡すようにしてください` pyramid.renderers.render_ * ``関数に渡します。
すべてのビューは:term: response`オブジェクトを返す必要がありますが、viewコンフィグレーション(以下で簡単に説明します)で指定された:term: renderer`を使用するビューは例外です。 :func: pyramid.renderers.render_to_response`関数は実際にレスポンスオブジェクトを返すショートカット関数です。これにより、上の例のビューは単に ` render_to_response() ``への呼び出しの結果を直接返すことができます。
明らかに、応答データを取得するために呼び出すすべてのAPIが応答オブジェクトを返すわけではありません。たとえば、1つ以上のテンプレートを応答データとして使用する文字列にレンダリングすることができます。 :func: pyramid.renderers.render APIはテンプレートを文字列にレンダリングします。 a:term: `response`オブジェクトを直接作成し、その文字列をレスポンスの本体として使うことができます:
1 2 3 4 5 6 7 8 9 | from pyramid.renderers import render
from pyramid.response import Response
def sample_view(request):
result = render('mypackage:templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
response = Response(result)
return response
|
なぜなら:term: view callable`関数は典型的には、app: Pyramid`の中で唯一のコードであり、テンプレートについて何か知っている必要があり、ビュー関数は非常に単純なPythonなので、あなたが最も関心のあるテンプレートシステム快適な内:アプリ: ピラミッド。テンプレートシステムをインストールし、そのAPI関数をビューモジュールにインポートし、それらのAPIを使用して文字列を生成し、その文字列を:app: Pyramid:term:` Response`オブジェクトの本体として返します。
例えば、以下の例は、app: Pyramid`の中で" raw "Mako_を使用する例です:term: view`:
1 2 3 4 5 6 7 8 | from mako.template import Template
from pyramid.response import Response
def make_view(request):
template = Template(filename='/templates/template.mak')
result = template.render(name=request.params['name'])
response = Response(result)
return response
|
サポートされているほうが使いやすいので、この特定のスニペットをプロジェクトで使用することはおそらくありません:ref: `Mako bindings <available_template_system_bindings> `。しかし、好きなテンプレートシステムが:app: `Pyramid`のレンダラー拡張としてサポートされていない場合は、上記のような独自の単純な組み合わせを作成することができます。
注釈
ビュー呼び出し可能ファイル内で直接app: Pyramid`バインディングを使用せずにサードパーティのテンプレート言語を使用する場合、ref: reload_templates_section`で説明されている自動テンプレートリロード戦略は利用できません。またテンプレートアセットの上書き機能も説明しませんin:ref: overriding_assets_section`を利用することはできません。また、その言語を使用するテンプレートを:term: renderer`として使用することもできません。しかし、app: Pyramid`の下で使用するカスタムテンプレートシステムバインディングパッケージを書くことは、言語で書かれたテンプレートをレンダラーとして使用することができます。独自のテンプレートレンダラーの作成方法についてはref: `adding_and_overriding_renderers、パッケージの場合は:ref:` available_template_system_bindings`を参照してください。
ステータスコードとコンテンツタイプ、またはダイレクトテンプレートを使用するビューからの他の応答属性をさらに制御する必要がある場合は、これらの値に影響を与えるレスポンスに属性を設定できます。
func: `〜pyramid.renderers.render_to_response`によって返されるレスポンスオブジェクトのコンテンツタイプとステータスを変更する例を次に示します。
1 2 3 4 5 6 7 8 9 | from pyramid.renderers import render_to_response
def sample_view(request):
response = render_to_response('templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
response.content_type = 'text/plain'
response.status_int = 204
return response
|
func: `〜pyramid.renderers.render`(文字列)の結果を使用してレスポンスオブジェクトを作成する例を次に示します。
1 2 3 4 5 6 7 8 9 10 | from pyramid.renderers import render
from pyramid.response import Response
def sample_view(request):
result = render('mypackage:templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
response = Response(result)
response.content_type = 'text/plain'
return response
|
レンダリング時に使用されるシステム値¶
テンプレートを:func: 〜pyramid.renderers.render_to_response`または:func:〜pyramid.renderers.render`またはレンダラー= 引数を使用してレンダリングすると、設定を表示できます(参照:ref: templates_used_as_renderers` )、テンプレートを表すレンダラーにはいくつかの* system *値が与えられます。これらの値は、テンプレートに提供されます。
- ``要求 ``
- `` render_to_response``または `` render`` *または*への `` request``キーワード引数として提供される値は、 `` renderer = ``設定を表示する引数が使用されているときにビューに渡されるリクエストオブジェクトです。テンプレートをレンダリングします。
- `` req``
- `` request``のエイリアスです。
- 「文脈」
- `` render_to_response``や `` render``にキーワード引数として `` request``が与えられていれば、現在の:app: Pyramid:term:` context`、 `` render``や `` render``に `` None``、 ``キーワード引数は提供されませんでした。この値は、使用されているビュー設定への `` renderer = ``引数の結果としてテンプレートがレンダリングされた場合に常に提供されます。
- `` get_csrf_token() ``
- 現在のCSRFトークンにアクセスするための便利な関数。詳細は:ref: `get_csrf_token_in_templates`を参照してください。
- `` renderer_name``
- レンダリングを実行するために使用されるレンダラー名。たとえば、 `` mypackage:templates / foo.pt``などです。
- `` renderer_info``
- :class: pyramid.interfaces.IRendererInfo`インタフェースを実装しているオブジェクトです。基本的には、 ` name``、 `` package``、 `` type``の属性を持つオブジェクトです。
- 「見る」
- このテンプレートのレンダリングに使用されたビュー呼び出し可能オブジェクト。呼び出し可能なビューがクラスベースのビューのメソッドである場合、これはメソッドが定義されたクラスのインスタンスになります。ビューcallableが関数またはインスタンスの場合、それはその関数またはインスタンスになります。この値は、 `` renderer =
引数の結果としてテンプレートがレンダリングされた場合にのみ自動的に表示されることに注意してください。 `` render_to_response``や `` render
APIを使うと `` None``になります。
term: `renderer globals`を定義することによって、レンダリングの結果として実行されるすべてのテンプレートに渡されるより多くの値を定義することができます。
これらのシステム値で特定のレンダラーが行うことは、レンダラー自体に依存しますが、ほとんどのテンプレートレンダラーは、これらの名前をトップレベルのテンプレート変数として使用できます。
コンフィグレーション経由でレンダラーとして使用されるテンプレート¶
:func: 〜pyramid.renderers.render_to_response`を使用して、ビューの呼び出し可能コードでテンプレートを手動でレンダリングする代わりに、あなたの*ビュー設定*内に:term: renderer`としてテンプレートを指定することができます。これは、app: `Pyramid`でサポートされているテンプレート言語のいずれかで行うことができます。
ビューの設定でレンダラーを使用するには、 renderer`引数としてtemplate:term: asset specification`を指定するか、:term: view callable`の:term: view configuration`に属性を指定します。次に、そのビューから呼び出し可能な辞書*を返します。呼び出し可能なビューによって返されるディクショナリ項目は、レンダラーテンプレートが最上位の名前として使用できるようになります。
a:term: view configuration`のレンダラーとしてのテンプレートの関連付けは、テンプレートのレンダリングを扱う:term: view callable`内のコードを置き換えることを可能にします。
次に、class: 〜pyramid.view.view_config`デコレータを使用して:term: view configuration`を指定してテンプレートレンダラーを指定する例を示します:
1 2 3 4 5 | from pyramid.view import view_config
@view_config(renderer='templates/foo.pt')
def my_view(request):
return {'foo':1, 'bar':2}
|
注釈
あなたは、レンダラー設定ビュー呼び出し可能から返された辞書結果のキーとして `` request``値を与える必要はありません。 :app: `Pyramid`は自動的にこの値をあなたに提供し、最も正確なシステム値がレンダラーに提供されます。
警告
上記の `` @ view_config``設定デコレータの `` renderer``引数は、テンプレート* path です。上記の例では、 `` templates / foo.pt``は relative *です。何に対して、あなたは頼む?カメレオンレンダラーを使用しているため、ビュー構成を定義するファイルが存在するディレクトリからの相対パスであることを意味します。この場合、これは `` my_view``関数を定義するファイルを含むディレクトリです。
同様のレンダラー構成を必須に行うことができます。参照:ref: `views_which_use_a_renderer`を参照してください。
参考
参照:ref: `built_in_renderers`も参照してください。
レンダラーパスは通常単純な相対パス名ですが、レンダラーとして指定されたパスは、UNIXではスラッシュ、Windowsではドライブレター接頭辞から始まる絶対パスにすることができます。パスは、 `` some.dotted.package_name:relative / path``の形式で:term: `asset specification`とすることもできます。これにより、別のパッケージにあるテンプレートアセットを扱うことができます。
任意のテンプレートシステムのテンプレートだけでなく、レンダラーとして使用することもできます。バインディングは、app: `Pyramid`がテンプレート言語テンプレートをレンダラーとして使用するために特別に存在する必要があります。
デフォルトでは、テンプレートレンダラーを介してレンダリングされたビューは、ステータスコード*が `` 200 OK``、 content-type *が `` text / html``のa:term: Response`オブジェクトを返します。コンテンツタイプ、ヘッダ、ステータス属性などのレンダラを使用するビューのレスポンスの属性を変更するには、 `class: pyramid.response.Response`オブジェクトのAPIを `` request ''として公開する必要があります.response``を呼び出して辞書を返します。詳細はref: `request_response_attr`を参照してください。
レンダラー・ビュー構成を介してレンダリングされたテンプレートには、必要に応じてレンダリングされたテンプレートに提供されるものと同じシステム値のセットが提供されます。参照:ref: `renderer_system_values`を参照してください。
テンプレートのデバッグ¶
未定義の変数( `` $ {wrong} ``など)を持つテンプレートをレンダリングした結果のA:exc: `NameError`例外は次のようになります:
RuntimeError: Caught exception rendering template.
- Expression: ``wrong``
- Filename: /home/fred/env/proj/proj/templates/mytemplate.pt
- Arguments: renderer_name: proj:templates/mytemplate.pt
template: <PageTemplateFile - at 0x1d2ecf0>
xincludes: <XIncludes - at 0x1d3a130>
request: <Request - at 0x1d2ecd0>
project: proj
macros: <Macros - at 0x1d3aed0>
context: <MyResource None at 0x1d39130>
view: <function my_view at 0x1d23570>
NameError: wrong
出力には、エラーが発生したテンプレートとテンプレート自体に渡された引数が表示されます。
テンプレートの自動リロード¶
アプリケーション・プロセスを再起動することなく、テンプレート・ファイルに対する変更がすぐに表示されることがよくあります。 :app: `Pyramid`では、アプリケーション開発環境を設定して、テンプレートへの変更を自動的に検出し、次のレンダリング時にテンプレートを再ロードすることができます。
警告
本番サイトでは、自動テンプレートリロードの動作は推奨されません。レンダリングがわずかに遅くなるためです。それは通常、開発中にのみ望ましいです。
テンプレートの自動リロードを有効にするには、環境変数または設定ファイルの設定を使用します。
環境変数を使用するには、 `` PYRAMID_RELOAD_TEMPLATES``オペレーティングシステム環境変数を `` 1``に設定して、シェルのもとでアプリケーションを起動します。例:
$ PYRAMID_RELOAD_TEMPLATES=1 $VENV/bin/pserve myproject.ini
同じ目的のためにアプリケーションの `` .ini``ファイル内の設定を使うには、アプリケーションの設定セクション内で `` py```を `` true``に設定します:
1 2 3 | [app:main]
use = egg:MyProject
pyramid.reload_templates = true
|
利用可能なアドオンテンプレートシステムバインディング¶
Pylonsプロジェクトは、以下を含む異なるテンプレート言語へのバインディングを提供するいくつかのパッケージを管理しています:
テンプレート言語 | ピラミッドバインディング | デフォルトの拡張機能 |
---|---|---|
カメレオン | ピラミッド_カメレオン | .pt、.txt |
Jinja2 | ピラミッド_jinja2 | .jinnja2 |
マコ | ピラミッド_マコ | .mak、.mako |