簡體   English   中英

如何獲取Django響應對象的內容長度?

[英]How do I get the content length of a Django response object?

在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' 但是中間件中沒有“內容長度”,“print response.items()”顯示:

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

中間件訂單有什么問題嗎?

我通過fire-debug檢查過,響應頭中有'Content-Length'。 但是中間件中沒有“內容長度”[...]中間件訂單是否有任何問題?

是。 中間件類在處理請求時自上而下(在settings.MIDDLEWARE_CLASSES )應用,在處理響應時自下而上。 如果你的中間件類中有'django.middleware.http.ConditionalGetMiddleware' ,它會在HttpResponse中添加一個'Content-Length'標題。

雖然如果你把你的中間件類放在settings.MIDDLEWARE_CLASSES 'django.middleware.http.ConditionalGetMiddleware' ,它會在處理響應時先應用這個,然后再應用ConditionalMiddleware 這就是為什么你在Firebug中看到Content-Length標頭的原因,盡管在調用Middleware時它尚未處理。

有關Middleware的更多信息,請參閱Django Middleware文檔

len(response.content)怎么樣? 這會給你回復內容中的字符數。 我猜這不一定與字節數相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM