これは確かに可能ですが、実装はほぼ完全にPyramidやJinja2とは関係ありません。Pyramid(または他のWebフレームワーク)が機能する方法は、クライアントから少しのテキストを取得し(リクエストオブジェクトに抽象化されます)、基本的に応答として別のテキストのブロブを返すため、操作は多かれ少なかれアトミックです-テンプレートエンジンがページの全文の生成を完了するまで、応答はクライアントに返送されません。
実際には、Pyramidにデータをクライアントにビットごとに送信させる方法があります。これにより、ブラウザはページを段階的にレンダリングします(ダイヤルアップ接続時のように)。これは、ファイルに直接書き込みます。応答の本体を表すオブジェクト:
import time
def some_view(request):
for i in range(1, 31):
request.response.body_file.write(".")
time.sleep(1)
ただし、このアプローチは少し制限があります。これは、送信済みのデータにのみデータを追加できるためです。たとえば、「お待ちください、グラフが読み込まれています」というメッセージを表示して実際のグラフに置き換える方法はありません。最初にページのヘッダーとフッターをロードしてから、中央に何かを挿入します。また、このアプローチでは、テンプレートを手動でレンダリングするか、テンプレートをまったく使用しないようにする必要があります。私はこれをいくつかの長時間実行バッチ操作にのみ使用しました
質問で述べたように、より良い手法には、JavaScriptを使用して個別のURLからページのビットをロードすることが含まれます。非同期でロードされるブロックは、しばしば「部分的」と呼ばれると思います。
メインページと挿入するビットを表すいくつかの個別のビューを登録します。たとえば、/questions/123454
ページの主要部分を/questions/123454/badges
ロードし、バッジ付きのブロックを/questions/123454/related
ロードし、関連する質問のリストをロードします。
パーシャルが挿入されるページのプレースホルダーを定義します。
<div id="badges-partial">読み込み中...</div>
ページにJavaScriptを少し追加して、パーシャルをロードします(jqueryを使用すると小さくなります:):
$(function () {
$("#badges-partial").load("/questions/123454/badges");
$("#related-partial").load("/questions/123454/related");
});
ご覧のとおり、JavaScriptソリューションはよりクリーンで、簡単で、柔軟性があります。