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!
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. =/ –