Fixed #26145 -- Made debug context processor return queries for all databases.

This commit is contained in:
Mounir Messelmeni 2016-04-09 14:09:08 +02:00 committed by Tim Graham
parent 9e3f141701
commit 03e1cc930c
6 changed files with 27 additions and 5 deletions

View File

@ -9,6 +9,8 @@ of a DjangoTemplates backend and used by RequestContext.
from __future__ import unicode_literals
import itertools
from django.conf import settings
from django.middleware.csrf import get_token
from django.utils.encoding import smart_text
@ -40,10 +42,13 @@ def debug(request):
context_extras = {}
if settings.DEBUG and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
context_extras['debug'] = True
from django.db import connection
from django.db import connections
# Return a lazy reference that computes connection.queries on access,
# to ensure it contains queries triggered after this function runs.
context_extras['sql_queries'] = lazy(lambda: connection.queries, list)
context_extras['sql_queries'] = lazy(
lambda: list(itertools.chain(*[connections[x].queries for x in connections])),
list
)
return context_extras

View File

@ -699,8 +699,13 @@ the request's IP address (``request.META['REMOTE_ADDR']``) is in the
you're in :setting:`DEBUG` mode.
* ``sql_queries`` -- A list of ``{'sql': ..., 'time': ...}`` dictionaries,
representing every SQL query that has happened so far during the request
and how long it took. The list is in order by query and lazily generated
on access.
and how long it took. The list is in order by database alias and then by
query. It's lazily generated on access.
.. versionchanged:: 1.10
In older versions, only the queries for the default database alias were
included.
``django.template.context_processors.i18n``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -414,6 +414,9 @@ Templates
* Allowed :tfilter:`dictsort` to order a list of lists by an element at a
specified index.
* The :func:`~django.template.context_processors.debug` context processor
contains queries for all database aliases instead of only the default alias.
Tests
~~~~~

View File

@ -12,4 +12,8 @@ Second query list: {{ sql_queries|length }}
Third query list: {{ sql_queries|length }}
{% for obj in other_debug_objects.all %}{{ obj }}{% endfor %}
Fourth query list: {{ sql_queries|length }}
{% endif %}

View File

@ -87,3 +87,5 @@ class DebugContextProcessorTests(TestCase):
self.assertContains(response, 'Second query list: 1')
# Check we have not actually memoized connection.queries
self.assertContains(response, 'Third query list: 2')
# Check queries for DB connection 'other'
self.assertContains(response, 'Fourth query list: 3')

View File

@ -8,5 +8,8 @@ def request_processor(request):
def debug_processor(request):
context = {'debug_objects': DebugObject.objects}
context = {
'debug_objects': DebugObject.objects,
'other_debug_objects': DebugObject.objects.using('other'),
}
return render(request, 'context_processors/debug.html', context)