2011-04-05 63 views
8

在Django中,我尝试记录请求和响应内容的长度,这与Django服务器打印到stderr的内容完全相同。如何获取Django响应对象的内容长度?

[05/Apr/2011 22:59:08] "GET /pages/ HTTP/1.1" 200 332161 
[05/Apr/2011 22:59:15] "GET /pages/12 HTTP/1.1" 301 0 
[05/Apr/2011 22:59:15] "GET /pages/12/ HTTP/1.1" 200 361474 
[05/Apr/2011 22:59:16] "GET /pages/12/load/tags/ HTTP/1.1" 200 13899 
[05/Apr/2011 22:59:16] "GET /pages/12/load/comments/ HTTP/1.1" 200 82 

因此,我写了一个简单的中间件如下,但'Content-Length'的值总是空的。

class LogHttpResponse(object): 
    def process_response(self, request, response): 
     import datetime 
     print response.items() 
     time_text = datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S') 
     print '[%s] "%s %s" %d %s' % (time_text, request.method, request.path, 
             response.status_code, 
             response.get('Content-Length', '')) 
     return response 

我已经通过消防检查调试,存在响应头“内容长度”。但在中间件没有“内容长度”,“打印response.items()”显示:

[('Content-Type', 'text/html; charset=utf-8')] 

有中间件订单的任何问题?

+2

如果'Transfer-Encoding'是'chunked',那么就没有'Content-Length'头。 http://tools.ietf.org/html/rfc2616#section-4.4 – 2011-04-05 16:20:42

回答

6

len(response.content)怎么样?这会给你响应内容中的字符数量。我想这不一定与字节数相同。

+1

它的工作原理。谢谢。 – William 2011-04-05 16:38:00

+0

@威廉:优秀! – 2011-04-05 17:05:30

15

我已经检查了fire-debug,在 响应标头中有'Content-Length'。但中间件没有'Content-Length' [...]中间件订单是否有问题?

是的。在处理请求时自中间件类应用自上而下(在settings.MIDDLEWARE_CLASSES中),处理响应时自下而上应用中间件类。如果您在中间件类中有'django.middleware.http.ConditionalGetMiddleware',它将为HttpResponse添加一个'Content-Length'标头。

如果你把你的中间件类settings.MIDDLEWARE_CLASSES'django.middleware.http.ConditionalGetMiddleware'后处理响应时它会首先应用此一个,然后应用ConditionalMiddleware事后虽然。这就是为什么你在Firebug中看到一个Content-Length头文件,尽管当你调用中间件时它还没有被处理。

有关中间件的更多信息,请参见Django Middleware documentation