10

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

[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 

我已经通过 fire-debug 进行了检查,响应 headers 中有“Content-Length”。但是中间件中没有'Content-Length',“print response.items()”显示:

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

中间件命令有问题吗?

4

2 回答 2

16

我已经通过 fire-debug 进行了检查,响应标头中有“Content-Length”。但是中间件中没有'Content-Length' [...] 中间件订单有问题吗?

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

虽然如果你把你的中间件类放在后面'django.middleware.http.ConditionalGetMiddleware'settings.MIDDLEWARE_CLASSES它会在处理响应时首先应用这个,然后再应用ConditionalMiddleware。这就是您Content-Length在 Firebug 中看到标头的原因,尽管在调用中间件时它尚未处理。

有关中间件的更多信息,请参阅Django 中间件文档

于 2011-04-06T03:01:38.543 回答
7

怎么样len(response.content)?这将为您提供响应内容中的字符数。我想这不一定与字节数相同。

于 2011-04-05T16:20:14.263 回答