from django.core.exceptions import MiddlewareNotUsed from django.conf import settings from django.db import connection from redis.connection import Connection from time import time class RedisDumpMiddleware(object): def __init__(self): if not settings.DEBUG: raise MiddlewareNotUsed() def process_view(self, request, callback, callback_args, callback_kwargs): if settings.DEBUG and not getattr(Connection, '_logging', False): # save old methods setattr(Connection, '_logging', True) # self.orig_pack_command = \ # Connection.pack_command # instrument methods to record messages Connection.pack_command = \ self._instrument(Connection.pack_command) return None def process_response(self, request, response): # if settings.DEBUG and hasattr(self, 'orig_pack_command'): # # remove instrumentation from redis # setattr(Connection, '_logging', False) # Connection.pack_command = \ # self.orig_pack_command return response def _instrument(self, original_method): def instrumented_method(*args, **kwargs): message = self.process_message(*args, **kwargs) if not message: return original_method(*args, **kwargs) start = time() result = original_method(*args, **kwargs) stop = time() duration = stop - start connection.queries.append({ 'redis': message, 'time': '%.3f' % duration, }) return result return instrumented_method def process_message(self, *args, **kwargs): query = ' '.join([str(arg) for arg in args if not isinstance(arg, Connection)]) return { 'query': query, }