2011-10-04 10 views
7

Oto middleware, że używam:ContentNotRenderedError po Django uaktualnić

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 

Został on doskonale pracuje dla mnie Django 1.3, ale ten złamał kiedy przeniesieni do django bagażnik (1.4+) Dzisiaj, z wyjątek: -

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. 

Byłbym wdzięczny, gdyby ktoś za pomocą pnia Django wskazał mi właściwy kierunek. Dzięki!

+1

nie wiem. Ale przez wygląd komunikatu nowsza wersja nie pozwala już na dostęp do zawartości odpowiedzi w view_view, powinien być dostępny w innym widoku oprogramowania pośredniego. =/ –

Odpowiedz

3

rozwiązanie Hacktastic: Można temu zapobiec poprzez sprawdzenie czy odpowiedź ma atrybut is_rendered a jeśli tak, to prawda, że ​​przed zmianą ciąg STATYSTYKI następująco:

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

To nie naprawiło tego samego problemu w mojej aplikacji po aktualizacji do wersji 1.4 - nadal próbuję znaleźć rozwiązanie –