| # Copyright 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Custom middlewares applicable to all apps on this site.""" |
| |
| from __future__ import print_function |
| |
| from django.db import connection |
| |
| |
| class SqlPrintingMiddleware(object): |
| """Middleware to print SQL stats for each page load.""" |
| |
| # We hard code the terminal width because appengine SDK does not support the |
| # fcntl python module. Without that, there's no reliable way to obtain the |
| # terminal width. |
| TERMINAL_WIDTH = 80 |
| INDENTATION = 2 |
| SQL_WIDTH = TERMINAL_WIDTH - INDENTATION |
| INDENTATION_SPACE = ' ' * INDENTATION |
| |
| def _DisplayRed(self, value): |
| return '\033[1;31m%s\033[0m' % value |
| |
| def _DisplayGreen(self, value): |
| return '\033[1;32m%s\033[0m' % value |
| |
| def _PrintWithIndentation(self, value): |
| print ('%s%s' % (self.INDENTATION_SPACE, value)) |
| |
| def process_response(self, _, response): |
| """Log SQL stats before forwarding response to the user.""" |
| if len(connection.queries) > 0: |
| total_time = 0.0 |
| for query in connection.queries: |
| total_time = total_time + float(query['time']) |
| |
| nice_sql = query['sql'] |
| sql = '[%s] %s' % (self._DisplayRed(query['time']), nice_sql) |
| |
| while len(sql) > self.SQL_WIDTH: |
| self._PrintWithIndentation(sql[:self.SQL_WIDTH]) |
| sql = sql[self.SQL_WIDTH:] |
| self._PrintWithIndentation(sql) |
| self._PrintWithIndentation(self._DisplayGreen( |
| '[TOTAL QUERIES: %s]' % len(connection.queries))) |
| self._PrintWithIndentation(self._DisplayGreen( |
| '[TOTAL TIME: %s seconds]' % total_time)) |
| return response |