【问题标题】:How do I get the content length of a Django response object?如何获取 Django 响应对象的内容长度?
【发布时间】:2011-07-30 02:57:43
【问题描述】:

在 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 检查,响应标头中有“Content-Length”。但是中间件中没有'Content-Length',“print response.items()”显示:

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

中间件顺序有问题吗?

【问题讨论】:

标签: django http httpresponse content-length


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 请注意,Content-Length 标头现在已添加到 CommonMiddleware 中的 HttpResponse。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2018-06-24
    • 2012-07-07
    • 1970-01-01
    • 2013-12-19
    • 2013-07-23
    相关资源
    最近更新 更多