1

特定のページに多くの分析とデータをロードするページがあり、これまでのところロードは問題ありませんが、速度を上げることができるかどうか疑問に思っています。高速化するために私が試みなければならなかったアイデアは、 の各部分を別々にレンダリングすることでした。

たとえば、SO のプロファイル ページを見てください。質問、回答、評判、タグ、アカウント、バッジ、投票のキャストがあり、現在のモデルではこれらが に収集view.pyされ、テンプレートによってレンダリングされます。しかし、XYZ の理由で「レピュテーション」または「タグ」クエリが遅い場合は、ほとんどのユーザーにとってそれほど重要でなくても、ページ全体の読み込みが遅くなります。JavaScript を使用してリクエストを作成し、json 応答をページに非同期でレンダリングすることを考えましたが、私は Pyramid と Python を使用するのが本当に好きなので、可能であれば、これを行うために JavaScript を学ぶよりも、既に知っているツールを使用したいと考えています。このアプローチの利点は、最初にページの上部をロード/表示し、クエリが完了するとページの残りをレンダリングするか、クエリの速度によってレンダリングを順序付けできることです。

これは可能ですか、またはこれを行う方法について何か提案はありますか?

4

1 に答える 1

2

これは確かに可能ですが、実装はほぼ完全に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ソリューションはよりクリーンで、簡単で、柔軟性があります。

于 2012-07-19T21:32:20.863 に答える