2011-10-04 5 views
7

Ecco un middleware che io uso:ContentNotRenderedError dopo un Django aggiornamento

class StatsMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     # get number of db queries before we do anything 
     n = len(connection.queries) 

     # time the view 
     start = time.time() 
     response = view_func(request, *view_args, **view_kwargs) 
     totTime = time.time() - start 

     # compute the db time for the queries just run 
     queries = len(connection.queries) - n 
     if queries: 
     dbTime = reduce(add, [float(q['time']) 
           for q in connection.queries[n:]]) 
     else: 
      dbTime = 0.0 

     # and backout python time 
     pyTime = totTime - dbTime 

     stats = { 
     'totTime': totTime, 
     'pyTime': pyTime, 
     'dbTime': dbTime, 
     'queries': queries, 
     'sql': '<br />'.join([ '<div class="stats_sql_query">%s</div><div class="stats_sql_time">%s s</div>' % (q['sql'], q['time']) for q in connection.queries[n:]]), 
     } 

     # clean query cache 
     db.reset_queries() 

     # replace the comment if found    
     if response and response.content: 
      s = response.content 
      regexp = re.compile(r'(?P<cmt><!--\s*STATS:(?P<fmt>.*?)-->)') 
      match = regexp.search(s) 
      if match: 
       s = s[:match.start('cmt')] + \ 
        match.group('fmt') % stats + \ 
        s[match.end('cmt'):] 
       response.content = s 

     return response 

Sta funzionando perfettamente per me fino a Django 1.3, ma questo ha rotto quando ho aggiornato a Django tronco (1.4+) di oggi, con la eccezione: -

Traceback: 
File "./../django-trunk/django/core/handlers/base.py" in get_response 
    105.       response = middleware_method(request, callback, callback_args, callback_kwargs) 
File "misc/middleware.py" in process_view 
    63.   if response and response.content: 
File "./../django-trunk/django/template/response.py" in _get_content 
    123.    raise ContentNotRenderedError('The response content must be ' 

Exception Type: ContentNotRenderedError at/
Exception Value: The response content must be rendered before it can be accessed. 

Apprezzeremmo se qualcuno che utilizza il django mi indica la giusta direzione. Grazie!

+1

Non lo so. Ma dall'aspetto del messaggio la versione più recente non ti permette più di accedere al contenuto della risposta in process_view, dovrebbe essere accessibile in un'altra vista middleware. =/ –

risposta

3

soluzione Hacktastic: È possibile difendersi da questo controllando se la risposta ha un attributo is_rendered e se sì, che è vero prima di modificare la stringa STATS come segue:

if response: 
     if (hasattr(response,'is_rendered') and response.is_rendered or not hasattr(response,'is_rendered')) and response.content: 
      s = response.content 
      regexp = re.compile(r'(?P<cmt><!--\s*STATS:(?P<fmt>.*?)-->)') 
      match = regexp.search(s) 
      if match: 
       s = s[:match.start('cmt')] + \ 
        match.group('fmt') % stats + \ 
        s[match.end('cmt'):] 
       response.content = s 

    return response 
+0

Questo non ha risolto lo stesso problema nella mia app quando ho aggiornato a django 1.4 - Sto ancora cercando di trovare una soluzione –