This middleware will add a log of the SQL queries executed at the bottom of every page. It also includes a query count and total and per-query execution times.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | from django.db import connection
from django.template import Template, Context
class SQLLogMiddleware:
    def process_response ( self, request, response ): 
        time = 0.0
        for q in connection.queries:
		time += float(q['time'])
        
        t = Template('''
            <p><em>Total query count:</em> {{ count }}<br/>
            <em>Total execution time:</em> {{ time }}</p>
            <ul class="sqllog">
                {% for sql in sqllog %}
                    <li>{{ sql.time }}: {{ sql.sql }}</li>
                {% endfor %}
            </ul>
        ''')
        response.content = "%s%s" % ( response.content, t.render(Context({'sqllog':connection.queries,'count':len(connection.queries),'time':time})))
        return response
 | 
More like this
- Add Toggle Switch Widget to Django Forms by OgliariNatan 1 month, 4 weeks ago
 - get_object_or_none by azwdevops 5 months, 2 weeks ago
 - Mask sensitive data from logger by agusmakmun 7 months, 2 weeks ago
 - Template tag - list punctuation for a list of items by shapiromatron 1 year, 9 months ago
 - JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 1 year, 9 months ago
 
Comments
Is there some trick or dependency to this? Returns 0 for me. 0 queries, 0 seconds.
#
If you see no queries:
You must set DEBUG=True in settings.py
#
I improved this snippet in Snippet 344.
It counts duplicated SQL queries.
#
Since Unicode branch I've changed code at bottom to:
#
more pythonic time calculation:
also this snippet doesn't work with JSON response content out of the box
#
Please login first before commenting.