3

すべてのページにいくつかの統計番号を表示する必要があるため、コンテキストプロセッサを使用することにしました。しかし、ページが読み込まれるたびに関数が2〜7回呼び出されていることがわかりました。関数内で4つのクエリを実行しているため、パフォーマンスが非常に悪くなっています。ページを読み込むたびに、最大28(4 * 7)のクエリが必要になる場合があります...

なぜこれが起こっているのか、そしてそれを回避するために何ができるのか知りたいです。

settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.request',
    'django.contrib.messages.context_processors.messages',
    'django.core.context_processors.static',
    'core.views.numbers',
)

views.py

def numeros(request):
      ...
    a=table1.objects.count()
    b=table2.objects.count()
    c=table3.objects.count()
    d=table4.objects.count()
     ...
    return {'a': a,
            'b': b,
            'c': c,
            'd': d,
            'e': e,
            'f': f,
            'g': g,
            'h': h
    }

[更新-ありがとう] @okmと@catherineは、非常に優れた補足的な説明を提供しました。@okmが言ったように、両方とも正しかった。私がRequestContextを何度も使用していたため、コンテキストプロセッサが何度も呼び出されていた。

@catherineも正しいです。コンテキストプロセッサに何を入れるかについては、特に注意を払う必要があります。コードを変更しましたが、ランディングページに統計番号を表示しているだけです。

4

3 に答える 3

5

インスタンスが初期化されると、コンテキストプロセッサが1つずつ呼び出されるRequestContextため、複数のRequestContextインスタンスが初期化される場合があります。たとえば、RequestContextサブクラスを使用して、__init__呼び出されたときに出力することにより、デバッグしてそれらを見つけることができますか?

または、本当に必要になるまで評価を遅らせる怠惰なオブジェクトを返し、重複したクエリの数が減るかどうかを確認することもできます。

def numeros(request):
    return {'a': table1.objects.count,
            'b': table2.objects.count,
            ...}
于 2013-03-09T09:02:04.317 に答える
3

TEMPLATE_CONTEXT_PROCESSORS で関数を設定すると、すべてのページで使用できるという利点があります。ただし、呼び出したり使用したりしなくても、設定から直接呼び出すため、クエリが読み込まれることに注意してください。パフォーマンスの低下につながります。コストがあまりかからないユーザーやその他のパラメーターなど、ほぼすべてのテンプレートでコンテキスト プロセッサを使用する必要がある場合は、コンテキスト プロセッサのみを使用してください。

于 2013-03-09T06:08:17.963 に答える
0

私は多かれ少なかれ同じ問題を抱えていました。そのため、RequestContext によって (TEMPLATE_CONTEXT_PROCESSORS から) 呼び出された関数の 1 つに入り、トレースバックをログに記録して、応答がだまされた場所を確認しました。

import traceback

logger.info(traceback.format_list(traceback.extract_stack()))

ロガーを有効にしていない場合は、印刷することもできます。

私の場合は、RequestContext とも呼ばれる debug_toolbar をオンにしていたためです。

于 2013-04-11T10:53:14.960 に答える