Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ContentNotRenderedError after a django upgrade

Here's a middleware that I use:

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

It has been working perfectly for me up to django 1.3 but this broke when I upgraded to django trunk (1.4+) today, with the exception:-

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.

Would appreciate it if some one using django trunk points me in the right direction. Thanks!

like image 518
Calvin Cheng Avatar asked Oct 04 '11 23:10

Calvin Cheng


1 Answers

Hacktastic solution: You can guard against this by checking if the response has an is_rendered attribute and if so, that it is true before changing the STATS string as follows:

   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
like image 74
Sameer Al-Sakran Avatar answered Oct 17 '22 15:10

Sameer Al-Sakran