2012-02-15 12 views
5

Qual è il modo più semplice per includere nome utente, nome e cognome e e-amil nell'errore django Traceback.Includi utente loggato django in django Errore Traceback

So che il modo in cui è create a custom error report:

  1. creare una nuova classe che innherit da django.views.debug.SafeExceptionReporterFilter
  2. Set DEFAULT_EXCEPTION_REPORTER_FILTER

Ma, quale metodo di dovrebbe sovrascrivere ricevere traceback con anche questa informazione?

Vorrei che il mio sguardo treceback piace:

Traceback (most recent call last): 

File "/usr...o/core/handlers/base.py", line 89, in get_response 
    response = middleware_method(request) 

File "/.../g...ap/utils/middleware.py", line 23,... 
    if elapsedTime.min > 15: 

TypeError: can't compare datetime.timedelta to int 

Logged user information: 
User: pepito 
name: Pepito Grillo 
e-mail: [email protected] 
+0

Ecco un modo più pulito: http://stackoverflow.com/a/4946443/565259 – Tobu

+0

@tobu, grazie mille. – danihp

risposta

7

l'ho fatto usando personalizzato Middleware. Non sono sicuro che questa sia la risposta migliore, ma è il modo in cui l'ho risolto per il mio progetto.

settings.py:

MIDDLEWARE_CLASSES = (
    ... 
    'utilities.custom_middleware.CustomMiddleware', 
    ... 
) 

utilità/custom_middleware.py:

from utilities.request import AddRequestDetails 

class CustomMiddleware(object): 
""" 
    Adds user details to request context during request processing, so that they 
    show up in the error emails. Add to settings.MIDDLEWARE_CLASSES and keep it 
    outermost(i.e. on top if possible). This allows it to catch exceptions in 
    other middlewares as well. 
""" 

    def process_exception(self, request, exception): 
     """ 
     Process the request to add some variables to it. 
     """ 

     # Add other details about the user to the META CGI variables. 
     try: 
      if request.user.is_authenticated(): 
       AddRequestDetails(request) 
       request.META['AUTH_VIEW_ARGS'] = str(view_args) 
       request.META['AUTH_VIEW_CALL'] = str(view_func) 
       request.META['AUTH_VIEW_KWARGS'] = str(view_kwargs) 
     except: 
      pass 

utilità/request.py:

def AddRequestDetails(request): 
""" 
    Adds details about the user to the request, so any traceback will include the 
    details. Good for troubleshooting; this will be included in the email sent to admins 
    on error. 
""" 
if request.user.is_anonymous(): 
    request.META['AUTH_NAME'] = "Anonymous User" 
    request.META['AUTH_USER'] = "Anonymous User" 
    request.META['AUTH_USER_EMAIL'] = "" 
    request.META['AUTH_USER_ID'] = 0 
    request.META['AUTH_USER_IS_ACTIVE'] = False 
    request.META['AUTH_USER_IS_SUPERUSER'] = False 
    request.META['AUTH_USER_IS_STAFF'] = False 
    request.META['AUTH_USER_LAST_LOGIN'] = "" 
else: 
    request.META['AUTH_NAME'] = str(request.user.first_name) + " " + str(request.user.last_name) 
    request.META['AUTH_USER'] = str(request.user.username) 
    request.META['AUTH_USER_EMAIL'] = str(request.user.email) 
    request.META['AUTH_USER_ID'] = str(request.user.id) 
    request.META['AUTH_USER_IS_ACTIVE'] = str(request.user.is_active) 
    request.META['AUTH_USER_IS_SUPERUSER'] = str(request.user.is_superuser) 
    request.META['AUTH_USER_IS_STAFF'] = str(request.user.is_staff) 
    request.META['AUTH_USER_LAST_LOGIN'] = str(request.user.last_login) 
+0

Farò dei test. Tornerò con le notizie. – danihp

+0

Sto rileggendo il tuo post. Sto cercando un modo per aggiungere meta informazioni solo in eccezioni, non per tutte le richieste. Per evitare un sovraccarico. Cosa ne pensi di questo? – danihp

+0

Nella classe CustomMiddleware, è possibile sovrascrivere process_exception e utilizzare lo stesso codice di cui sopra. Basta cambiare 'def process_view (...' a 'def process_exception (...'. Non l'ho ancora testato, ma penso che dovrebbe funzionare. Altro sul middleware personalizzato qui: https://docs.djangoproject.com/it/dev/topics/http/middleware/ – Furbeenator

8

La mia soluzione banale (opere in Django 1.5)

settings.py:

MIDDLEWARE_CLASSES = (
    ... 
    'utilities.custom_middleware.UserTracebackMiddleware', 
    ... 
) 

custom_middleware.py:

class UserTracebackMiddleware(object): 
    """ 
    Adds user to request context during request processing, so that they 
    show up in the error emails. 
    """ 
    def process_exception(self, request, exception): 
     if request.user.is_authenticated(): 
      request.META['AUTH_USER'] = unicode(request.user.username) 
     else: 
      request.META['AUTH_USER'] = "Anonymous User" 

Speranza che aiuta

+0

Perché la conversione in unicode? –