Django TEMPLATE_CONTEXT_PROCESSORS 被调用太多次

Tho*_*mas 3 django django-templates django-context

我需要在所有页面中显示一些统计数字,所以我决定使用上下文处理器。但我刚刚发现我的函数在每次加载页面时都会被调用 2 到 7 次。我在函数内部进行了 4 次查询,因此性能非常差。每个页面加载最多可能需要 28 (4*7) 个查询...

我想知道为什么会发生这种情况以及我可以做些什么来避免它。

设置.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',
)
Run Code Online (Sandbox Code Playgroud)

视图.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
    }
Run Code Online (Sandbox Code Playgroud)

[更新 - 谢谢] @okm 和 @catherine 提供了非常好的补充解释。两者都是正确的,正如@okm 所说,上下文处理器被多次调用,因为我多次使用 RequestContext。

@catherine 也是正确的。我们需要特别注意我们在上下文处理器中放置的内容。我更改了代码,只是在登录页面中显示统计数字。

okm*_*okm 5

上下文处理器在RequestContext实例初始化时被一个一个调用,因此您可能有多个RequestContext实例被初始化。您能否调试以找出它们,例如通过使用 RequestContext 子类在它出现时打印__init__在调用?

或者,您可以返回一个延迟对象,直到真正需要时才对其进行评估,然后查看重复查询的计数是否下降:

def numeros(request):
    return {'a': table1.objects.count,
            'b': table2.objects.count,
            ...}
Run Code Online (Sandbox Code Playgroud)