2011-10-04 18 views
7

Aquí es un middleware que utilizo:ContentNotRenderedError después de un Django actualización

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 

Se ha estado trabajando perfectamente para mí hasta Django 1.3, pero esto se rompió cuando actualicé a django tronco (1.4+) hoy, con la excepción: -

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. 

Me gustaría que alguien que usa el tronco de django me señale la dirección correcta. ¡Gracias!

+1

No sé. Pero según el aspecto del mensaje, la versión más reciente ya no le permite acceder al contenido de la respuesta en process_view, se debe acceder a ella en otra vista de middleware. =/ –

Respuesta

3

solución Hacktastic: Puede protegerse contra esto comprobando si la respuesta tiene un atributo is_rendered y si es así, que es verdad antes de cambiar la cadena de Estadística de la siguiente manera:

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

Esto no solucionó el mismo problema en mi aplicación cuando actualicé a django 1.4 - Todavía estoy tratando de encontrar una solución –

Cuestiones relacionadas