Pyramidのテンプレートコンテキストに相当するものは何ですか?
ピラミッドのIBeforeRenderイベントはこれと関係がありますか?公式ドキュメントを確認しましたが、IBeforeRenderイベントが正確に何であるかを理解するのは困難です。
Pyramidはすでにtmpl_context
Requestオブジェクトを提供しているので、非常に簡単に、BeforeRender
イベントをサブスクライブしてレンダラーグローバルに追加する必要があります。
def add_renderer_globals(event):
event['c'] = request.tmpl_context
event['tmpl_context'] = request.tmpl_context
config.add_subscriber(add_renderer_globals, 'pyramid.events.BeforeRender')
今後、リクエストを受け取ったときにコードでパラメータを設定できます。
request.tmpl_context.name = 'Bob'
その後、テンプレートはname
変数を参照する場合があります。
${ c.name }
代わりに、すべてのテンプレートで使用できる変数を詰め込むことができる「グローバルバッグ」を期待している場合は、IBeforeRenderに関する質問が適切です。
from pyramid.events import subscriber
from pyramid.events import BeforeRender
@subscriber(BeforeRender)
def add_global(event):
event['name'] = 'Pyramid Developer'
Configuratorをセットアップするときにグローバルを追加する別の方法もあります。完全な情報は、http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-eventで確認できます。
上記のソリューションは、Pylonsテンプレートコンテキストの動作を正確にコピーしていないように思われます。a
Pylonsでページ要求をレンダリングし、コンテキストに値を追加するc
と、テンプレートでとしてアクセスできますc.a
。ただし、別のリクエストをレンダリングすると、このキー/値は削除されます。
上記のピラミッドソリューションは、別の動作を示しています。キー/値c.a
はテンプレートコンテキストに残ります。場合によっては、これは望ましくありません。この違いを修正するための提案はありますか?
Pyramid doesn't really expose the "template context" to the developer (although it is used internally in the various template engine bindings for Pyramid).
Normally if you want to stuff something into "c" for use inside a template you simply pass it as a keyword argument to the render_to_response() call or as part of the dict that you return with a predefined renderer.
So to do something similar as http://pylonsbook.com/en/1.1/using-view-templates.html#using-the-template-context-c-global you would do:
@view_config(renderer="greeting.mako")
def index(request):
return {'name': 'Pyramid Developer'}
And greeting.mako :
<html>
<head>
<title>Greetings</title>
</head>
<body>
<h1>Greetings</h1>
<p>Hello ${name}!</p>
</body>
</html>
ピラミッドクックブックのパイロンマジックグローバルセクションから:
Pylonsには、現在のリクエストの状態データを含むいくつかのマジックグローバルがあります。最も近いピラミッドの同等物は次のとおりです。
(...)
pylons.tmpl_context
リクエストローカルデータのスクラッチオブジェクト。通常、変数をテンプレートに渡すために使用されます。Pyramidでは、変数のdictを返し、レンダラーにそれらをテンプレートに適用させます。または、ビューコードで自分でテンプレートをレンダリングすることもできます。
ビューがメソッドの場合、インスタンス変数を設定することもできます。ビューインスタンスは
view
、テンプレートのように表示されます。これには2つの主な用途があります。1つは、サイトテンプレートの変数を設定することです。そうしないと、すべてのreturndictに含まれている必要があります。2つ目は、HTMLレンダリングに固有の変数の場合、ビューがHTMLレンダラーと非HTMLレンダラー(JSONなど)の両方に登録されている場合です。Pyramidには、に「tmpl_context」のポートがあります。
request.tmpl_context
これは、テンプレートにとして表示されc
ます。ただし、Pyramid-Pylonsユーザーの間で流行することはなく、文書化されていません。
テンプレートとビューの間で変数を便利にやり取りするためのグローバルディクショナリを探している場合は、pyramid.request.TemplateContextを使用してください
テンプレートページ:
<%!
from pyramid.request import TemplateContext as c
c.foo = 123
%>
次に、同じ方法でビューにTemplateContextをインポートすることにより、変数にアクセスできます。
from pyramid.request import TemplateContext as c
これは、多かれ少なかれパイロンのtmpl_contextと同等である必要があります。