import os from django.db import connection from django.conf import settings def terminal_width(): """ Function to compute the terminal width. WARNING: This is not my code, but I've been using it forever and I don't remember where it came from. """ width = 0 try: import struct, fcntl, termios s = struct.pack('HHHH', 0, 0, 0, 0) x = fcntl.ioctl(1, termios.TIOCGWINSZ, s) width = struct.unpack('HHHH', x)[1] except: pass if width <= 0: try: width = int(os.environ['COLUMNS']) except: pass if width <= 0: width = 80 return width class SqlPrintingMiddleware(object): """ Middleware which prints out a list of all SQL queries done for each view that is processed. This is only useful for debugging. """ def process_response(self, request, response): if not settings.DEBUG: return indentation = 2 if len(connection.queries) > 0 and settings.DEBUG: width = 10000 #terminal_width() total_time = 0.0 for query in connection.queries: nice_sql = query['sql'].replace('"', '').replace(',', ', ') sql = "\033[1;31m[%s]\033[0m %s" % (query['time'], nice_sql) total_time += float(query['time']) while len(sql) > width - indentation: print("%s%s" % (" " * indentation, sql[:width - indentation])) sql = sql[width - indentation:] print("%s%s\n" % (" " * indentation, sql)) replace_tuple = (" " * indentation, str(total_time)) print("%s\033[1;32m[TOTAL TIME: %s seconds]\033[0m" % replace_tuple) return response