#settings.py #Should we log full HTML responses? LOGALL_LOG_HTML_RESPONSE = True # If we how do we recognized a full HTML response LOGALL_HTML_START = "<!DOCTYPE html" #logAll.models.py from django.db import models from django.contrib.auth.models import User class Record(models.Model): """ Basic log record describing all user interaction with the UI. Will be propagated by a middle ware. This will be one BIG DB table! """ created_at = models.DateTimeField(auto_now_add = True) sessionId = models.CharField(max_length=256) requestUser = models.ForeignKey(User) requestPath = models.TextField() requestQueryString = models.TextField() requestVars = models.TextField() requestMethod = models.CharField(max_length=4) requestSecure = models.BooleanField(default=False) requestAjax = models.BooleanField(default=False) requestMETA = models.TextField(null=True, blank=True) requestAddress = models.IPAddressField() viewFunction = models.CharField(max_length=256) viewDocString = models.TextField(null=True, blank=True) viewArgs = models.TextField() responseCode = models.CharField(max_length=3) responseContent = models.TextField() #logAll.middleware.py import time import simplejson as json from django.core.exceptions import ObjectDoesNotExist from logAll.models import Record from settings import LOGALL_LOG_HTML_RESPONSE, LOGALL_HTML_START class LogAllMiddleware(object): def process_request(self,request): # Only log requests of authinticate users try: if not request.user.is_authenticated(): return None except AttributeError: return None # Skip favicon requests cause I do not care about them if request.path =="/favicon.ico": return None newRecord = Record( created_at = str(time.time()), sessionId = request.session.session_key, requestUser = request.user, requestPath = request.path, requestQueryString = request.META["QUERY_STRING"], requestVars = json.dumps(request.REQUEST.__dict__), requestMethod = request.method, requestSecure = request.is_secure(), requestAjax = request.is_ajax(), requestMETA = request.META.__str__(), requestAddress = request.META["REMOTE_ADDR"], ) newRecord.save() return None def process_view(self, request, view_func, view_args, view_kwargs): try: if not request.user.is_authenticated(): return None except AttributeError: return None # Fix the issue with the authrization request try: theRecord = Record.objects.get( sessionId = request.session.session_key, requestUser = request.user, requestPath = request.path, requestMethod = request.method, requestSecure = request.is_secure(), requestAjax = request.is_ajax(), requestMETA = request.META.__str__() ) theRecord.viewFunction = view_func.func_name theRecord.viewDocString = view_func.func_doc theRecord.viewArgs = json.dumps(view_kwargs) theRecord.save() except ObjectDoesNotExist: pass return None def process_response(self, request, response): # Only log autherized requests try: if not request.user.is_authenticated(): return response except AttributeError: return response # Skip favicon requests cause I do not care about them if request.path =="/favicon.ico": return response # Fix the issue with the authorization request try: theRecord = Record.objects.get( sessionId = request.session.session_key, requestUser = request.user, requestPath = request.path, requestMethod = request.method, requestSecure = request.is_secure(), requestAjax = request.is_ajax(), requestMETA = request.META.__str__() ) theRecord.responseCode = response.status_code # Decidce wether we want to log the a full html response # as this will probabaly will take a LOT of space. # # In my case most of the replies I want to catch happen # to be plain text ajax replies if LOGALL_LOG_HTML_RESPONSE: # IF set to true then log the respoce regardless theRecord.responseContent = response.content elif response.content.startswith(LOGALL_HTML_START): theRecord.responseContent = "FULL HTML RESPONSE" else: theRecord.responseContent = response.content theRecord.save() except ObjectDoesNotExist: pass return response