Как получить длину содержимого объекта ответа Django? - PullRequest
9 голосов
/ 05 апреля 2011

В 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')]

Есть ли проблема с заказами промежуточного программного обеспечения?

Ответы [ 2 ]

15 голосов
/ 06 апреля 2011

Я проверил через fire-debug, в заголовках ответа есть Content-Length.Но в промежуточном программном обеспечении нет «Content-Length» [...] Есть ли проблемы с заказами промежуточного программного обеспечения?

Да.Промежуточные классы применяются сверху вниз (в settings.MIDDLEWARE_CLASSES) при обработке запроса и снизу вверх при обработке ответа.Если у вас есть 'django.middleware.http.ConditionalGetMiddleware' в ваших классах промежуточного программного обеспечения, он добавит заголовок 'Content-Length' в HttpResponse.

Хотя, если вы поставите свой класс промежуточного программного обеспечения после 'django.middleware.http.ConditionalGetMiddleware' в settings.MIDDLEWARE_CLASSES, он сначала применяет этот класс при обработке ответа, а затем применяет ConditionalMiddleware после.Вот почему вы видите заголовок Content-Length в Firebug, хотя он еще не обработан при вызове Middleware.

См. Документация по Middleware Django для получения дополнительной информации о Middleware.

7 голосов
/ 05 апреля 2011

Как насчет len(response.content)? Это даст вам количество символов в содержании ответа. Я предполагаю, что это не обязательно совпадает с количеством байтов.

...